2010-10-14 37 views
1

我的表有3列:T-SQL查詢幫助 - 選擇唯一分組?

RecordId 
Value 
InsertDate 

每個的recordId在表中多個條目。事實上,表格每天都會更新數次。

如何編寫t-sql查詢來爲每個唯一記錄選擇所有最新行(基於InsertDate)?

我的t-sql技能不存在。

在此先感謝

+0

由於表每天更新數次,InsertDate同時包含日期和時間,是否正確? – LittleBobbyTables 2010-10-14 14:10:51

回答

3

可以使用CTE(公共表表達式)和分級功能 - 是這樣的:

;WITH YourQuery AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY RecordId ORDER BY InsertDate DESC) 'RowNumber' 
    FROM dbo.YourTable 
    WHERE InsertDate < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) 
) 
SELECT * 
FROM YourQuery 
WHERE RowNumber = 1 

的CTE(內部SELECT)選擇所有行,隔斷他們通過RecordId,他們的訂單通過InsertDate下降(最新的在前) - 所以這給你的所有記錄的列表,通過ID,InsertDate有序,並從1開始爲每一個新RecordId一個RowNumber場。

因此,對於每個RecordIdRowNumber = 1的條目是最近的條目 - 這就是第二個(外部)SELECT所做的。

+0

非常感謝。如何修改此選項以選擇InsertDate不等於今天的最新版本? – DayTwo 2010-10-14 15:20:59

+0

@DayTwo:無需任何修改 - 它總是會顯示最近的日期 - 今天或昨天或一個星期前 - 不管它是什麼,它抓住最近的一個 – 2010-10-14 15:26:22

+0

是感謝,但我不希望結果包含今天的日期。所以如果InsertDate = Today應該使用下一個最新的日期。再次感謝您的幫助 – DayTwo 2010-10-14 15:28:51

0

請參閱@ marc_s的答案,但也應該在該表中添加另一列,該表是行的唯一標識。不是這個問題,但對於後來的你會遇到。即使你不認爲你會使用它,在桌子上有一個主鍵有很多很好的理由。

alter table YourTable 
add Id int identity not null 
alter table YourTable 
add constraint "YourTable_PK" primary key ("Id") 
0

我認爲沒有CTE和ROW_NUMBER可能(也更容易)...或者我錯過了什麼?

select RecordID, max(InsertDate) 
from YourTable 
group by RecordID