gpt4 book ai didi

sql - T-SQL 将当前行更新到下一行的值问题

转载 作者:行者123 更新时间:2023-12-04 22:02:37 26 4
gpt4 key购买 nike

我正在寻找一些关于在 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。

目前,有超过 5000 个实体受此影响,因此我试图以某种方式在每条记录上更新此信息,以节省时间。

我能做但要花很多时间的是
1. 将所有公司的历史记录的最大行数合并为一个数
2.为总行数创建相同数量的临时表
3. 将最小开始日期值插入到第一个临时表中
4.将不在临时表1中的最小值插入到表2中,依此类推
5. 然后将临时表 1 的结束日期更新为临时表 2 的开始日期 -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

除了我的一长串临时表/更新之外的任何建议将不胜感激!我在想一些可能是光标的东西,但我不太确定这是否是为这种情况编写更新的更快方法。

最佳答案

我认为可更新的 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);

关于sql - T-SQL 将当前行更新到下一行的值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502385/

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