【发布时间】:2018-07-31 23:43:16
【问题描述】:
这是我的架构和数据的示例:
declare @temp table (rowid int identity(1,1), groupNumber int, typeName varchar(10), valueA int, valueB int, effectiveDate datetime, expiredDate datetime)
insert @temp values (234545, 'Upper', 1, 1000, '1/1/18 11:31:00', '2/1/18 22:01:00')
insert @temp values (234545, 'Lower', 2, 0, '1/1/18 11:31:00', '2/1/18 22:01:00')
insert @temp values (234545, 'Upper', 1, 1000, '2/1/18 22:01:00', '4/15/18 05:39:00')
insert @temp values (234545, 'Lower', 2, 0, '2/1/18 22:01:00', '4/15/18 05:39:00')
insert @temp values (234545, 'Upper', 1, 900, '4/15/18 05:39:00', '6/1/18 10:32:00')
insert @temp values (234545, 'Lower', 2, 0, '4/15/18 05:39:00', '6/1/18 10:32:00')
insert @temp values (234545, 'Upper', 1, 900, '4/15/18 06:39:00', '6/1/18 10:32:00')
insert @temp values (234545, 'Lower', 2, 0, '4/15/18 06:39:00', '6/1/18 10:32:00')
insert @temp values (234545, 'Upper', 1, 800, '6/1/18 10:32:00', null)
insert @temp values (234545, 'Lower', 2, 0, '6/1/18 10:32:00', null)
select *
from @temp
对于每个组号,有多个组,一组由生效日期定义,生效日期始终等于前一组的过期日期。所以在这个例子中,有 5 个集合,我想要做的是删除多余的集合,即第 3/4 行和第 5/6 行。我只关心 valueA 或 valueB 发生变化时的新集合。最终我的目标是通过一次一个循环遍历组来清理生产数据库中的这些数据,因为大约 60% 的行反映了从一组到下一组在任何重要方面都没有变化(即 typeName、valueA , 值 B)。
问题是,当我删除这 4 行时,我还需要将前两行的 expiredDate 设置为等于第 7 行和第 8 行的有效日期,因为它们总是需要排队。
另一个问题是我想运行一个脚本(可能通过 SQL 代理作业)循环遍历表(obvs 不是生产中的表变量)并删除行并使用新事务更新 expiredDates每个组号。如果我在作业完成之前停止作业并且它处于事务的中间(很可能),有没有办法让它自动回滚?
【问题讨论】:
-
为什么不想删除前两行(按照
INSERT语句的顺序),它们也过期了?以及为什么要首先删除它们。您可以将它们保留为历史记录,仅通过将时间戳与现在进行比较来检索有效行。 -
请向我们展示预期的结果并更详细地解释所需的逻辑。
-
我的代码大部分都可以工作,但问题是你描述的这些对似乎只是通过身份密钥彼此相邻的事实来链接。这是我们知道例如最后一行不是第二行的更高版本的唯一方法吗?除了日期匹配外,两者都有。如果组号不同,我可以让它工作!
-
它们以日期链接,即一组的生效日期等于前一组的失效日期。
标签: sql sql-server tsql sql-server-2014