T-SQL确定历史记录表中的状态更改

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被设置两次).

任何帮助将不胜感激!

bob*_*obs 5

这对你有用吗?

;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)