如何在T-SQL中GROUP BY一列和ORDER BY另一列

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条款,它们似乎按字母顺序排列.我意识到我的查询中也需要日期列,但是我可以输入它并在结果中"隐藏"它吗?或者我是否需要将目前为止的结果保存在临时表中并加入常规表?最好的方法是什么?

SQL小提琴在这里!

Gor*_*off 5

使用窗口功能:

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 在这里.


Ral*_*ine 5

SELECT 
  ItemType, 
  MAX(Cost) AS MostExpensivePerType
FROM 
  Purchases 
GROUP BY 
  ItemType 
ORDER BY
  Max(PurchaseDate) DESC
Run Code Online (Sandbox Code Playgroud)