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

Я использую методологию Kimball для медленно меняющихся измерений в нашем хранилище данных. У нас возникли проблемы, когда запись обновляется несколько раз в течение одного дня, а 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 ответа

Решение

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

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

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

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

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

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

;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'
Другие вопросы по тегам