最近的記錄 - 向下滾動,我添加了一個編輯 -SQL服務器 - 選擇從一組類似記錄
因此,這裏是我的方案。每次有人對某些數據進行更改時,我都有一張表格。原因是我們需要能夠審計所有的變化。
但是,我只想檢索用戶所做的一系列編輯的最新記錄。
所以我們可以說有三個用戶,用戶A,B和C
用戶A 10度的變化(10個條目中的表格)。 用戶B使得5改變 用戶A 3個更多的變化 用戶C使2改變
我想回去是什麼: 最近的2所記錄的是C語言創建的 最近的3個記錄是A創建 最近的5個記錄是b創建 最近的10條記錄是A創建
,共4行,我回去
這裏是我試過了,但問題是,當LastUpd時RowNum不會回到1 atedBy變化:
WITH cte AS
(
SELECT
[LastUpdatedOn]
,[LastUpdatedBy]
,ROW_NUMBER() OVER(PARTITION BY [LastUpdatedBy] ORDER BY [LastUpdatedOn] DESC) [RowNum]
FROM [HistoricalTable]
)
SELECT
[LastUpdatedOn]
,[LastUpdatedBy]
,RowNum
FROM cte
--WHERE RowNum = 1
ORDER BY [LastUpdatedOn] DESC;
而這裏的輸出我得到(**星號代表的行,我想回去)
LastUpdatedOn LastUpdatedBy RowNum
**2011-06-07 13:07:26.917 629 1**
2011-06-07 12:57:53.700 629 2
2011-06-07 12:57:44.387 629 3
2011-06-07 12:57:34.913 629 4
2011-06-07 12:57:25.040 629 5
2011-06-07 12:57:19.927 629 6
2011-06-07 12:55:17.460 629 7
2011-06-07 12:55:12.287 629 8
2011-06-07 12:30:34.377 629 9
**2011-06-07 11:54:05.727 4 1**
**2011-06-07 11:50:02.723 629 10** (If this number went back to 1, my query would have worked fine)
2011-06-07 11:26:43.053 629 11
2011-06-07 10:54:32.867 629 12
2011-06-07 10:46:32.107 629 13
2011-06-07 10:40:52.937 629 14
**2011-06-07 10:39:50.880 3 1**
---------------- ---編輯--------------------
所以我想出了一個解決方案,但它不是很優雅,不知道我是否喜歡它,但它的伎倆。這可能會讓你更好地理解我想要完成的事情。
DECLARE @temp AS TABLE(LastUpdatedOn datetime, LastUpdatedBy int null, RowNum int);
DECLARE @newTable AS TABLE(LastUpdatedOn datetime, LastUpdatedBy int null);
DECLARE @lastUserId int = 0;
INSERT INTO @temp
SELECT
[LastUpdatedOn]
,[LastUpdatedBy]
,ROW_NUMBER() OVER(ORDER BY [LastUpdatedOn] DESC) [RowNum]
FROM [HistoricalTable]
DECLARE @totalRecords int;
SELECT @totalRecords = COUNT(*) FROM @temp;
DECLARE @counter int = 0;
WHILE @counter <= @totalRecords BEGIN
SET @counter = @counter + 1;
INSERT INTO @newTable
SELECT LastUpdatedOn, LastUpdatedBy
FROM @temp
WHERE RowNum = @counter AND (@lastUserId != LastUpdatedBy OR (LastUpdatedBy IS NULL));
SELECT @lastUserId = LastUpdatedBy FROM @temp WHERE RowNum = @counter;
END
SELECT * FROM @newTable;
而返回的數據:
LastUpdatedOn LastUpdatedBy
2011-06-07 13:07:26.917 629
2011-06-07 11:54:05.727 4
2011-06-07 11:50:02.723 629
2011-06-07 10:39:50.880 3
此查詢(WHERE RowNum = 1未註釋)確實可以爲您提供所需的結果...由於您按用戶對結果集進行分區,然後根據日期對數據集進行排序,因此您應該得到最新的最新記錄當您通過RowNum = 1篩選記錄時,每個用戶都可以再次驗證一次嗎? – Chandu 2011-06-07 19:38:13
在你的例子中,A做了10次改變,然後A做了3次更改。您的代碼將返回A所做的最新更改。但是你的問題說你需要兩行A的更改。第一組A變更與第二組變更有何區別? – 8kb 2011-06-07 19:44:56
@Cybernate - 是的,它會篩選記錄,如果我取消註釋,但不完全正確。如果你看到我的數據輸出,你會看到它從用戶629到用戶4的位置,然後再到629。再次進入629的時候,RowNum會選擇10而不是1,然後我就不會得到我需要的記錄。 – Makotosan 2011-06-07 20:02:00