Обновить запись в таблице SCD2
У меня есть таблица, в которой записи исторически с 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
Если имеется несколько неподтвержденных записей, они также должны быть исправлены с обновлением ValidFrom правильно и не должно быть скорректировано
Может кто-нибудь, пожалуйста, помогите мне? Спасибо
1 ответ
Решение
Поскольку ваши данные "почти в порядке", вы можете использовать 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);
Это делает обновление только тогда, когда есть перекрытие.