2013-07-10 42 views
1

我有一个DocumentHistory表与此列:TSQL的GroupBy最大

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 

我该怎么办呢?

+1

这有助于[公用表表达式(http://msdn.microsoft.com/en-us/library/ms190766%28v=sql.105%29.aspx) –

回答

2

使用ranking functionROW_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; 

看到它在这里的行动:

+0

@MahmoodGamal:谢谢,是否有可能使用这个查询作为视图? – Masoud

+0

@Masoud - 当然,只要'CREATE VIEW viewname as'然后放置查询,看到这个[** Demo **](http://www.sqlfiddle.com/#!3/0ebf6/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