2017-07-01 95 views
0

我在其中的條目被作爲歷史與SCD 2 表看起來像這樣的表:更新記錄在SCD2表

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

回答

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); 

僅在存在重疊時才執行更新。