所以我知道这个问题并不是新问题,但我试图围绕它来理解最佳方式来处理这种情况。查询基于另一个值的聚合的唯一值,同时完全按第三个值进行分组
说我有一个假设表“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
基本上我想要的是MAX SomeDateTime
值按我的GroupID
列分组。踢球者是我不想要分组的ID
列, 我只想知道对应于MAX SomeDateTime
的'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看起来很sl sl。
另一种伪解决方案是:
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
上加入此结果集。
有谁知道任何聪明的解决方案?窗口函数有什么好用处?
谢谢!
它看起来像这可能是我后我。我不需要在CTE中使用GROUP BY,但是...会继续使用这一点。谢谢! – 2010-01-21 15:44:46
@Justin - 我已根据您的评论更正了我的答案。 – 2010-01-21 16:51:16