我有一张桌子,除了每个 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)
这是使用窗口函数可以解救的经典情况!
就像是:
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_date
或the_date
代替 - 它有助于可读性并且在调试时不太容易出现问题!
另外,请在您的问题中包括您的 SQL Server 版本。
最后,如果你提供了表格和数据的小提琴,你可以让那些试图帮助你的人更容易- 这允许回答者测试他们的回复并有助于消除重复工作(也包括问题中的小提琴数据) .