缓慢变化的维度 - Effective/Expiry 一天内 运行 多次时日期损坏

Slowly Changing Dimension - Effective/Expiry Date corruption when running multiple times in one day

我正在使用 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 是如何大于 Expiry Date - 这不好:(

有没有其他人遇到过此类问题 - 您是如何处理的?

我在 SSIS 中使用渐变维度工具

您的问题看起来更像是数据映射。检查 ETL 包中的映射连接。使用标志列。查找 table 中存在的记录并标记为 1。Select 仅标记记录并查找所有属性。如果更改将 CurrRowInd 更新为 N 并插入新记录

要么您必须将时间添加到源 table 中的有效日期(这实际上并不难),或者调整设置有效 Date/Expiry 日期的代码有人进行了更改(例如,这可能是触发因素)。

您关于有效日期的约定似乎是一行从有效日期开始有效(在时间方面,从生效日期 00:00:00)到到期日期(在时间方面,直到到期日期) 23:59:59)。因此,更新这些日期的代码必须在同一天将更早的、现在完全无效的更新设置为:

生效日期:今天 到期日期:前一天。

显然维度的 ETL 必须与此一致,并忽略 EffectiveDate>ExpiryDate 的行。

我运行再次陷入这个问题并找到了解决方案。在 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'