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

时间:2015-12-28 23:38:33

标签: sql sql-server tsql dml

我正在寻找一些关于什么类型的更新在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

除了我的临时表/更新列表之外的任何建议都将不胜感激!我正在思考可能是光标的问题,但我不太确定这是否是为这种情况编写更新的更快捷方式。

1 个答案:

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