Обновление записи в таблице 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 является правильным и не требует корректировки.

Кто-нибудь может мне помочь? Спасибо


person AmBlack    schedule 01.07.2017    source источник


Ответы (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);

Это делает обновление только тогда, когда есть перекрытие.

person Gordon Linoff    schedule 02.07.2017