tho*_*mas 4 t-sql sql-server-2008
我有一个应用程序,它将对"生产"表中记录的更改记录到"历史"表中.历史表基本上是生产表的字段副本的字段,有一些额外的列,如上次修改日期,最后由用户修改等.
这很有效,因为我们可以在记录更改时随时获取记录的快照.但是,它很难确定记录的唯一状态更改.一个例子如下.
BoxID StatusID SubStatusID ModifiedTime
1 4 27 2011-08-11 15:31
1 4 11 2011-08-11 15:28
1 4 11 2011-08-10 09:07
1 5 14 2011-08-09 08:53
1 5 14 2011-08-09 08:19
1 4 11 2011-08-08 14:15
1 4 9 2011-07-27 15:52
1 4 9 2011-07-27 15:49
1 2 8 2011-07-26 12:00
Run Code Online (Sandbox Code Playgroud)
正如您在上表中看到的那样(数据来自真实系统,其他字段已移除,以简洁和安全)BoxID 1对生产记录进行了9次更改.其中一些更新导致状态发生变化,而另一些则没有,这意味着其他字段(未显示)已更改.
我需要能够在TSQL中从这些数据中提取唯一的状态变化.鉴于上面的输入表,我正在寻找的输出如下.
BoxID StatusID SubStatusID ModifiedTime
1 4 27 2011-08-11 15:31
1 4 11 2011-08-10 09:07
1 5 14 2011-08-09 08:19
1 4 11 2011-08-08 14:15
1 4 9 2011-07-27 15:49
1 2 8 2011-07-26 12:00
Run Code Online (Sandbox Code Playgroud)
这不是由StatusID和SubStatusID分组和服用容易min(ModifiedTime)再加入放回历史表,因为状态可以倒着走,以及(见StatusID 4,SubStatusID 11被设置两次).
任何帮助将不胜感激!
这对你有用吗?
;WITH Boxes_CTE AS
(
SELECT Boxid, StatusID, SubStatusID, ModifiedTime,
ROW_NUMBER() OVER (PARTITION BY Boxid ORDER BY ModifiedTime) AS SEQUENCE
FROM Boxes
)
SELECT b1.Boxid, b1.StatusID, b1.SubStatusID, b1.ModifiedTime
FROM Boxes_CTE b1
LEFT OUTER JOIN Boxes_CTE b2 ON b1.Boxid = b2.Boxid
AND b1.Sequence = b2.Sequence + 1
WHERE b1.StatusID <> b2.StatusID
OR b1.SubStatusID <> b2.SubStatusID
OR b2.StatusID IS NULL
ORDER BY b1.ModifiedTime DESC
;
Run Code Online (Sandbox Code Playgroud)