最近的记录 - 向下滚动,我添加了一个编辑 -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