我有一个表,其中的条目用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用箭头标记的记录是不正确的,此记录将通过更新进行更正。因此,在更新记录之后,如下所示:(下一条记录中的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
发布于 2017-07-02 08:00:24
因为您的数据“几乎是有序的”,所以您可以使用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);仅当存在重叠时才执行更新。
https://stackoverflow.com/questions/44866361
复制相似问题