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将当前行更新到下一行的值问题的主要内容,如果未能解决你的问题,请参考以下文章