所以我知道这个问题不是一个新问题,但我正在努力解决这个问题,并了解解决此类情况的最佳方法。
假设我有一个假设表’X’,看起来像这样:
GroupID ID (identity) SomeDateTime -------------------------------------------- 1 1000 1/1/01 1 1001 2/2/02 1 1002 3/3/03 2 1003 4/4/04 2 1004 5/5/05
我想查询它,以便结果集如下所示:
---------------------------------------- 1 1002 3/3/03 2 1004 5/5/05
基本上,我想要的是SomeDateTime按我的GroupID列分组的MAX值。更重要的是,我不想按ID列分组,我只想知道与MAX对应的“ ID” SomeDateTime。
SomeDateTime
GroupID
ID
我知道一个伪解决方案是:
;WITH X1 as ( SELECT MAX(SomeDateTime) as SomeDateTime, GroupID FROM X GROUP BY GroupID ) SELECT X1.SomeDateTime, X1.GroupID, X2.ID FROM X1 INNER JOIN X as X2 ON X.DateTime = X2.DateTime
但这不能解决DateTime可能不是唯一的事实。像这样加入DateTime似乎很草率。
另一个伪解决方案可能是:
SELECT X.GroupID, MAX(X.ID) as ID, MAX(X.SomeDateTime) as SomeDateTime FROM X GROUP BY X.GroupID
但是,不能保证ID实际上会匹配SomeDateTime来自该行的行。
第三个不太有用的选项可能是:
SELECT TOP 1 X.GroupID, X.ID, X.SomeDateTime FROM X WHERE X.GroupID = 1 ORDER BY X.SomeDateTime DESC
但是很明显,这仅适用于单个已知的GroupID。我希望能够在GroupID和/或上加入此结果集ID。
有人知道任何明智的解决方案吗?窗口函数有什么好的用法?
谢谢!
我认为这会做您想要的。
;WITH X1 AS ( SELECT SomeDateTime ,GroupID ,ID ,ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY SomeDateTime DESC ) AS rn FROM X ) SELECT SomeDateTime ,GroupID ,ID FROM X1 WHERE rn = 1