我正在寻找一些关于什么类型的更新在t-sql DML的特定场景中最佳的建议。
出现了数据问题,其中结束日期是当前记录的开始日期之前的一天,并且需要将结束日期设置为多个实体的下一行的开始日期
例如
rowid entity id record_type start_date end_date
214 250 1 H 2015-01-01 2014-12-31
329 250 1 H 2015-04-25 2015-04-24
533 250 1 C 2015-11-01 NULL
11 250 2 H 2015-06-01 2014-05-29
292 250 2 H 2015-09-11 2015-09-10
987 250 2 C 2015-10-01 NULL
我需要做的是将第一条记录end_date更新为每个雇员/实体的下一条记录startdate - 1。
目前,有超过5K的实体受此影响,所以我试图以某种方式更新每条记录以节省时间。
我能做的却是花了很多时间 1.将所有公司的最大行数历史记录合并为一个数字 2.为总行数创建相同数量的临时表 3.将最小开始日期值插入第一个临时表 4.将不在临时表1中的最小值插入表2中,依此类推 5.然后将临时表1的结束日期更新为temptable 2的startdate -1天 6.从那里,在每个临时表上使用多个更新语句在实际表上运行更新,并在rowid上加入。
最终输出如下:
rowid entity id record_type start_date end_date
214 250 1 H 2015-01-01 2014-04-24
329 250 1 H 2015-04-25 2015-10-31
533 250 1 C 2015-11-01 NULL
11 250 2 H 2015-06-01 2014-09-10
292 250 2 H 2015-09-11 2015-9-31
987 250 2 C 2015-10-01 NULL
除了我的临时表/更新列表之外的任何建议都将不胜感激!我正在思考可能是光标的问题,但我不太确定这是否是为这种情况编写更新的更快捷方式。
答案 0 :(得分:2)
我认为可更新的CTE是可行的方法。在SQL Server 2012+中,您可以使用lead()
:
with toupdate as (
select t.*,
lead(start_date) over (partition by entity order by start_date) as next_start_date
from t
)
update toupdate
set end_date = dateadd(day, -1, next_start_date)
where end_date = dateadd(day, -1, start_date);