更新 SCD2 中的记录 Table
Update a Record in a SCD2 Table
我有一个 table,其中的条目使用 SCD 2 进行了历史记录
table 看起来像这样:
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
带箭头的记录不正确
此记录将通过更新进行更正。所以在更新记录之后看起来像这样:(来自下一个记录的 ValidTo = ValidFrom -1)
635582110901 15.02.2016 10.11.2016
635582110901 11.11.2016 15.11.2016
635582110901 16.11.2016 12.12.2016
如果有多个不正确的记录,也必须通过更新更正这些记录
ValidFrom正确,不用调整
有人可以帮助我吗?
谢谢
因为你的数据是"almost in order",你可以使用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);
这仅在存在重叠时才进行更新。
我有一个 table,其中的条目使用 SCD 2 进行了历史记录 table 看起来像这样:
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
带箭头的记录不正确 此记录将通过更新进行更正。所以在更新记录之后看起来像这样:(来自下一个记录的 ValidTo = ValidFrom -1)
635582110901 15.02.2016 10.11.2016
635582110901 11.11.2016 15.11.2016
635582110901 16.11.2016 12.12.2016
如果有多个不正确的记录,也必须通过更新更正这些记录 ValidFrom正确,不用调整
有人可以帮助我吗? 谢谢
因为你的数据是"almost in order",你可以使用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);
这仅在存在重叠时才进行更新。