【问题标题】:How to GROUP BY one column and ORDER BY another in T-SQL如何在 T-SQL 中按一列分组并按另一列排序
【发布时间】:2015-11-21 17:46:14
【问题描述】:

我有一个包含一些值的项目表,其中包括成本和购买日期。我正在尝试获取最昂贵商品的列表,每种商品类型一个,按特定商品的购买日期排序,结果中没有购买日期。

我的桌子(简体):

CREATE TABLE Purchases
    (ItemType varchar(25),
    Cost int,
    PurchaseDate smalldatetime)

我的样本数据:

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')

我的预期输出(为清楚起见添加了日期):

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)

到目前为止我的工作:

我来回尝试过,我最好的结果是这个查询:

SELECT 
    ItemType, MAX(Cost) AS MostExpensivePerType 
FROM 
    Purchases 
GROUP BY 
    ItemType 
ORDER BY 
    MostExpensivePerType DESC

每个项目类型产生最昂贵的项目,但按成本排序。如果没有ORDER BY 子句,它们似乎是按字母顺序排列的。我意识到我的查询中也需要日期列,但我可以输入它并在结果中“隐藏”它吗?或者我是否需要将到目前为止的结果保存在临时表中并加入我的常规表?解决此问题的最佳方法是什么?

SQL Fiddle here!

【问题讨论】:

  • 我喜欢您将输入数据和所需输出添加到问题中的方式。但我无法完全理解您的问题。你想在最终输出中得到什么?
  • 我想要一个每个类别中最昂贵物品的列表:最昂贵的帽子、衬衫等(每一个),但我希望列表按我购买它们的日期排序。所以即使最贵的帽子比最贵的衬衫还要贵,如果衬衫是在帽子之前买的,衬衫应该排在第一位。见马克班尼斯特的回答:)
  • 实际上,我刚刚意识到我误解了这个问题 - 我以为您希望它按最近购买的类别中的 any 项目排序,但我现在意识到您希望它在类别中最昂贵的商品的购买日期之前订购。我建议不接受我的回答,而是接受戈登的回答。
  • 好的,我不接受你的回答。戈登的回答对我不起作用,但我相信我们会弄清楚的:)

标签: sql tsql ssms sql-server-2014


【解决方案1】:

使用窗口函数:

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;

SQLFiddle here.

【讨论】:

  • 这可能是我做错了什么,但我收到以下错误:消息 4104,级别 16,状态 1,第 23 行 无法绑定多部分标识符“p.ItemType”。消息 207,级别 16,状态 1,第 23 行无效的列名称“MostExpensivePerType”。
  • @Tobbe:我已经更新了 Gordon 的答案来解决这个问题,并添加了一个 SQLFiddle 链接。
【解决方案2】:
SELECT 
  ItemType, 
  MAX(Cost) AS MostExpensivePerType
FROM 
  Purchases 
GROUP BY 
  ItemType 
ORDER BY
  Max(PurchaseDate) DESC

【讨论】:

  • 可能是我的数据库软件,但我收到此错误:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非 TOP、OFFSET 或 FOR XML 是也指定了。
【解决方案3】:
SELECT a.ItemType,a.MostExpensivePerType 
FROM (
  SELECT ItemType, MAX(Cost) AS MostExpensivePerType , MAX(PurchaseDate) AS MaxPurchaseDate 
  FROM Purchases 
  GROUP BY ItemType
  ) a
  ORDER BY a.MaxPurchaseDate DESC

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2020-12-14
    • 2017-04-01
    • 2022-01-11
    • 2018-10-23
    相关资源
    最近更新 更多