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

Posted

技术标签:

【中文标题】T-SQL将当前行更新到下一行的值问题【英文标题】:T-SQL Updating current row to next row's value issue 【发布时间】:2016-04-02 19:49:31 【问题描述】:

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

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

【问题讨论】:

使用SELF JOIN 和LAG() 函数。 提示:使用适当的软件(mysql、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。 【参考方案1】:

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

【讨论】:

这是一个很好的正确答案。然而,一些 &"çà!è 决定在 2016 年开发服务器时使用 2008R2 服务器进行暂存和运行。任何人都可以帮我提供一个适用于 2008R2 的解决方案

以上是关于T-SQL将当前行更新到下一行的值问题的主要内容,如果未能解决你的问题,请参考以下文章

Apache Beam 根据前一行的值更新当前行的值

如何在不使用临时表的情况下检索当前行和先前行的值之间的值差异?

更新查询 - 前行 x 和当前行 y 的总和

vi常用用法总结

如何通过在文本区域中的当前行末尾按空格来转到下一行

在 Swift 中使用命令行工具更新当前行