所以我知道这个问题并不是一个新问题,但我正在努力解决这个问题并了解处理此类情况的最佳方法。
假设我有一个假设的表“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
基本上我想要的是 MAXSomeDateTime
按我的值分组GroupID
柱子。更重要的是我不想按ID
柱子,
我只想知道 MAX 对应的“ID”SomeDateTime
.
我知道一种伪解决方案是:
;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
and/or ID
.
有谁知道有什么聪明的解决方案吗?窗口函数有什么好的用途吗?
Thanks!