TSQL GroupBy Max

时间:2013-07-10 09:16:35

标签: sql-server tsql

我有一个DocumentHistory表,其中包含以下列:

HistoryId   DocumentId    ChangeDate
    1           100       1/1/2005  
    2           100       2/1/2010         
    3           200       2/2/2006 
    4           100       2/2/2001 
    5           200       2/2/2000

HistoryId是关键。 我想写一个TSQL查询,找到每个文档的最大ChangeDate并返回其HistoryId,我的意思是查询结果将是:

HistoryId       ChangeDate
    2            2/1/2010
    3            2/2/2006

我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用ranking function ROW_NUMBER() OVER(PARTITION BY ... ORDER BY...)

WITH CTE
AS
(
   SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY DocumentId 
                       ORDER BY ChangeDate DESC) AS RN
   FROM DocumentHistory 
)
SELECT HistoryId, ChangeDate
FROM CTE
WHERE RN = 1;

请在此处查看:

答案 1 :(得分:2)

SELECT b.HistoryId,a.ChangeDate from 
(SELECT DocumentId,max( ChangeDate) as ChangeDate
FROM DocumentHistory   GROUP BY DocumentId) a
INNER JOIN DocumentHistory b ON a.DocumentId=b.DocumentId AND a.ChangeDate=b.ChangeDate

这适用于没有CTE支持的数据库 在这里测试http://www.sqlfiddle.com/#!3/c33be/16