首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新SCD2表中的记录

更新SCD2表中的记录
EN

Stack Overflow用户
提问于 2017-07-02 07:57:04
回答 1查看 293关注 0票数 0

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

代码语言:javascript
复制
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 )

代码语言:javascript
复制
635582110901    15.02.2016  10.11.2016
635582110901    11.11.2016  15.11.2016 
635582110901    16.11.2016  12.12.2016

如果存在多个incorect记录,则还必须使用更新更正这些记录ValidFrom是否正确,并且不需要进行调整

有人能帮帮我吗?Thx

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-02 08:00:24

因为您的数据“几乎是有序的”,所以您可以使用lead()来实现此目的:

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
update toupdate
    set validto = dateadd(day, -1, next_validfrom)
    where validto > dateadd(day, -1, next_validfrom);

仅当存在重叠时才执行更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44866361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档