Медленно изменяющееся измерение-эффективное/повреждение срока годности при выполнении несколько раз за один день

Я использую методологию Kimball для медленного изменения размеров в нашем datawarehouse. Мы столкнулись с проблемами, когда запись обновляется несколько раз в течение одного дня, и ETL запускается каждые 15 минут. Таким образом, даты вступления в силу и истечения срока действия становятся запутанными.

Например:

First      Last    Effective Date    Expiry Date   CurrRowInd
John       Smith   Jan 01, 1900      Aug 5, 2015   N
Jonathon   Smith   Aug 6, 2015       Aug 10, 2015  N
Jonathon   Smithe  Aug 11, 2015      Aug 10, 2015  Y

Посмотрите, как последняя строка имеет EffectiveDate больше, чем дата окончания срока действия — это не хорошо 🙁

Кто — нибудь еще сталкивался с такого рода проблемой-и как вы с ней справлялись?

Я использую медленно изменяющийся инструмент измерения в службах SSIS

3 ответа

  1. Ваша проблема больше похожа на сопоставление данных. Проверьте подключения сопоставления в пакете ETL. Используйте флаг столбец. Посмотрите на записи, которые существуют в вашей таблице и флаг до 1. Выберите только помеченные записи и поиск по всем атрибутам. Если изменения обновить CurrRowInd как N и вставить новую запись

  2. Либо вы должны добавить время к датам действия в исходной таблице (что на самом деле не так сложно сделать), или настроить код, который устанавливает дату вступления в силу/дату истечения срока действия, когда кто-то делает изменение (это может быть триггер, например).

    Ваше соглашение о сроках действия, по-видимому, заключается в том, что строка действительна с даты вступления в силу включительно (во времени, с даты вступления в силу 00:00:00) до даты окончания срока действия включительно (во времени, до даты окончания срока действия 23:59:59). Таким образом, код, который обновляет эти даты, должен был бы установить более раннее, теперь полностью недействительное обновление в тот же день, чтобы:

    EffectiveDate: сегодня
    ExpiryDate: за день до.

    Очевидно, ETL для измерения должен быть согласован с этим и игнорировать строки, где EffectiveDate>ExpiryDate.

  3. Я снова столкнулся с этой проблемой и нашел решение. После запуска процесса SCD я выполняю инструкцию delete для удаления всех записей, кроме одной, сделанных за один день.

    ;with  cte as (
    select e.EmployeeKey
            ,e.EmployeeID
            ,e.EffectiveDate
            ,e.ExpiryDate
            ,e.CurrentRowInd
            ,iif(e.EffectiveDate = LEAD(e.EffectiveDate) OVER (partition by EmployeeID order by EffectiveDate), 'DELETE','') AS Note
    from DimEmployees e
    where EmployeeID in (
                select EmployeeID
                from DimEmployees 
                group by EmployeeID, EffectiveDate
                having count(*) > 1
                )
    
    )
    DELETE
    from cte
    where Note = 'DELETE'