Медленно меняющееся измерение - повреждение даты вступления в силу / истечения срока действия при многократном запуске в течение одного дня
Я использую методологию 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'