更新SCD2表中的记录

时间:2017-07-01 23:57:04

标签: sql sql-server scd

我有一个表格,其中的条目用SCD 2进行了历史记录 表格如下:

PK              ValidFrom   ValidTo
635582110901    04.01.2016  21.01.2016
635582110901    22.01.2016  26.01.2016
635582110901    27.01.2016  14.02.2016
635582110901    15.02.2016  10.11.2016
635582110901    11.11.2016  23.01.2017 <--
635582110901    16.11.2016  12.12.2016
635582110901    13.12.2016  18.01.2017
635582110901    19.01.2017  22.01.2017
635582110901    23.01.2017  23.01.2017
635582110901    24.01.2017  21.02.2017
635582110901    22.02.2017  31.12.9999

标有箭头的记录是incorect 此记录将通过更新进行更正。所以在更新记录之后看起来像这样:( ValidTo = ValidFrom -1来自下一个记录)

635582110901    15.02.2016  10.11.2016
635582110901    11.11.2016  15.11.2016 
635582110901    16.11.2016  12.12.2016

如果有多个incorect记录,这些记录也必须通过更新进行更正 ValidFrom是正确的,无需调整

有人可以帮帮我吗? THX

1 个答案:

答案 0 :(得分:0)

由于您的数据“几乎按顺序”,因此可以使用lead()来实现此目的:

with toupdate as (
      select t.*,
             lead(validfrom) over (partition by pk order by validfrom) as next_validfrom
      from t
     )
update toupdate
    set validto = dateadd(day, -1, next_validfrom)
    where validto <> dateadd(day, -1, next_validfrom);

我必须强调,这将平铺主键的所有数据。如果允许间隙,则使用此版本:

update toupdate
    set validto = dateadd(day, -1, next_validfrom)
    where validto > dateadd(day, -1, next_validfrom);

只有在存在重叠时才会进行更新。

相关问题