我的表有3列:T-SQL查詢幫助 - 選擇唯一分組?
RecordId
Value
InsertDate
每個的recordId在表中多個條目。事實上,表格每天都會更新數次。
如何編寫t-sql查詢來爲每個唯一記錄選擇所有最新行(基於InsertDate)?
我的t-sql技能不存在。
在此先感謝
我的表有3列:T-SQL查詢幫助 - 選擇唯一分組?
RecordId
Value
InsertDate
每個的recordId在表中多個條目。事實上,表格每天都會更新數次。
如何編寫t-sql查詢來爲每個唯一記錄選擇所有最新行(基於InsertDate)?
我的t-sql技能不存在。
在此先感謝
可以使用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
場。
因此,對於每個RecordId
,RowNumber = 1
的條目是最近的條目 - 這就是第二個(外部)SELECT所做的。
請參閱@ marc_s的答案,但也應該在該表中添加另一列,該表是行的唯一標識。不是這個問題,但對於後來的你會遇到。即使你不認爲你會使用它,在桌子上有一個主鍵有很多很好的理由。
alter table YourTable
add Id int identity not null
alter table YourTable
add constraint "YourTable_PK" primary key ("Id")
我認爲沒有CTE和ROW_NUMBER可能(也更容易)...或者我錯過了什麼?
select RecordID, max(InsertDate)
from YourTable
group by RecordID
由於表每天更新數次,InsertDate同時包含日期和時間,是否正確? – LittleBobbyTables 2010-10-14 14:10:51