我有一个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
我该怎么做?
答案 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