gpt4 book ai didi

tsql - T-SQL 确定历史表中的状态变化

转载 作者:行者123 更新时间:2023-12-05 00:03:22 25 4
gpt4 key购买 nike

我有一个应用程序,它将“生产”表中记录的更改记录到“历史”表中。历史表基本上是生产表的字段副本的字段,还有一些额外的列,如上次修改日期、用户上次修改等。

这很有效,因为我们可以在记录更改时获得记录的快照。但是,很难确定记录的唯一状态更改。下面是一个例子。

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

正如您在上表中所见(数据来自真实系统,为简洁和安全起见,删除了其他字段)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

这不像按 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
;

关于tsql - T-SQL 确定历史表中的状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7033437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com