Tob*_*bbe 3 sql t-sql ssms sql-server-2014
我有一个带有一些值的项目表,其中包括成本和购买日期.我正在尝试获取最昂贵物品的清单,每种物品类型一个,按特定物品的购买日期排序,没有结果中购买日期.
我的桌子(简化):
CREATE TABLE Purchases
(ItemType varchar(25),
Cost int,
PurchaseDate smalldatetime)
Run Code Online (Sandbox Code Playgroud)
我的样本数据:
INSERT INTO Purchases VALUES
('Hat', 0, '2007-05-20 15:22'),
('Hat', 0, '2007-07-01 15:00'),
('Shirt', 3500, '2007-07-30 08:43'),
('Pants', 2000, '2008-07-30 12:00'),
('Pants', 4000, '2009-03-15 07:30'),
('Sweater', 3000, '2011-05-20 15:22'),
('Sweater', 3750, '2012-07-01 22:00'),
('Sweater', 2700, '2014-06-12 11:00'),
('Hat', 4700, '2015-06-29 07:10')
Run Code Online (Sandbox Code Playgroud)
我的预期输出(为清晰起见添加日期):
ItemType MostExpensivePerType
------------------------- --------------------
Shirt 3500 (2007-07-30 08:43)
Pants 4000 (2009-03-15 07:30)
Sweater 3750 (2012-07-01 22:00)
Hat 4700 (2015-06-29 07:10)
Run Code Online (Sandbox Code Playgroud)
到目前为止我的工作:
我来回尝试过,我最好的结果就是这个查询:
SELECT
ItemType, MAX(Cost) AS MostExpensivePerType
FROM
Purchases
GROUP BY
ItemType
ORDER BY
MostExpensivePerType DESC
Run Code Online (Sandbox Code Playgroud)
这会产生每件商品类型最贵的商品,但会按成本订购.没有该ORDER BY条款,它们似乎按字母顺序排列.我意识到我的查询中也需要日期列,但是我可以输入它并在结果中"隐藏"它吗?或者我是否需要将目前为止的结果保存在临时表中并加入常规表?最好的方法是什么?
使用窗口功能:
select ItemType, Cost MostExpensivePerType
from (select p.*,
row_number() over (partition by itemtype order by cost desc) as seqnum
from purchases p
) t
where seqnum = 1
order by PurchaseDate;
Run Code Online (Sandbox Code Playgroud)
SQLFiddle 在这里.
SELECT
ItemType,
MAX(Cost) AS MostExpensivePerType
FROM
Purchases
GROUP BY
ItemType
ORDER BY
Max(PurchaseDate) DESC
Run Code Online (Sandbox Code Playgroud)