为每个组选择除 Max(date) 之外的所有内容

Mis*_*ish 2 sql-server select

我有一张桌子,除了每个 groupID 的最大日期之外,我还想在其中提取所有内容。有没有简单的方法来做到这一点?

这是我想要做的:

SELECT 
groupId, 
Types,
MAX(Dates) as date

FROM TableData

Where Dates < Max(dates)

GROUP BY 
groupId, 
Types

//The table looks as follows:
ID      |   GroupID | Date
1       |     A     | 10-10-2020 -> don't show
2       |     A     | 09-10-2020
3       |     A     | 08-10-2020
4       |     B     | 10-10-2020 -> don't show
5       |     B     | 09-10-2020
6       |     B     | 08-10-2020


//Expected result:
GroupID | Date
  A     | 09-10-2020
  A     | 08-10-2020
  B     | 09-10-2020
  B     | 08-10-2020
Run Code Online (Sandbox Code Playgroud)

Vér*_*ace 6

这是使用窗口函数可以解救的经典情况!

就像是:

SELECT * FROM
(
  SELECT 
    group_id, 
    dates,
    ROW_NUMBER () OVER (PARTITION BY group_id
                        ORDER BY dates DESC) AS rn
  FROM table_data
) AS t
WHERE rn != 1
ORDER BY group_id, dates DESC;

   
Run Code Online (Sandbox Code Playgroud)

我可以敦促您不要使用关键字作为别名 - 使用类似my_datethe_date代替 - 它有助于可读性并且在调试时不太容易出现问题!

另外,请在您的问题中包括您的 SQL Server 版本。

最后,如果你提供了表格和数据的小提琴,你可以让那些试图帮助你的人更容易- 这允许回答者测试他们的回复并有助于消除重复工作(也包括问题中的小提琴数据) .

  • 如果日期可以出现多次,我可能会尝试使用 `RANK` 而不是 `ROW_NUMBER` - 因为这只会删除包含最大日期的第一行。除此之外,这就是我要走的路线。 (2认同)