2013-12-09 105 views
1

我有一個表結構如下非重複值:查詢,用於選擇表

ID  Name    RunDate 
10001  Item 1   12/09/2013 02:11:47 
10002  Item 2   12/09/2013 01:13:25 
10001  Item 1   12/09/2013 01:11:37 
10007  Item 7   12/08/2013 11:02:04 
10001  Item 1   12/08/2013 10:25:00 

我的問題是,該表將被髮送到通訊組的電子郵件,它使電子郵件這麼大因爲表格有超過數百行。我想要實現的是僅顯示DISTINCT ID僅顯示最近RunDate的記錄。

ID  Name    RunDate 
10001  Item 1   12/09/2013 02:11:47 
10002  Item 2   12/09/2013 01:13:25 
10007  Item 7   12/08/2013 11:02:04 

任何想法我可以做到這一點?我對聚合的東西不是很好,我用DISTINCT,但它總是弄亂我的查詢。

謝謝!

回答

2

這是更靈活,因爲它不要求所有列分組:

;WITH x AS 
(
    SELECT ID, Name, RunDate, /* other columns, */ 
    rn = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY RunDate DESC) 
    FROM dbo.TableName 
) 
SELECT ID, Name, RunDate /* , other columns */ 
    FROM x 
    WHERE rn = 1 
    ORDER BY ID; 

(因爲Name並不真的需要分組,並且實際上甚至不應該在此表中,並且GROUP BY解決方案的下一個後續問題幾乎總是「我如何添加<column x><column y>的輸出,如果它們有不同的值並且不能加到GROUP BY?「)

+0

謝謝!這非常有幫助!後續問題雖然...如果我還想輸出每個組/分區下包含的總行數,該怎麼辦?有沒有辦法做到這一點? – Smiley

+1

當然,在裏面加',c = COUNT(*)OVER(PARTITION BY ID)',外加''c'。 –

+0

ahhhh !!!天才要比!!!謝謝一堆! – Smiley

4

集團通過應該是不同的,並使用max()值來獲得最新的日期

select id, name, max(rundate) as rundate 
from your_table 
group by id, name