缓慢更改维度-一天内运行多次时,生效日期/到期日期已损坏



我正在使用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

查看最后一行的有效日期如何大于到期日期-这不好:(

其他人遇到过这种问题吗?你是如何处理的?

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

要么必须将时间添加到源表中的有效日期中(这并不难做到),要么在有人做出更改时调整设置生效日期/到期日期的代码(例如,这可能是一个触发器)。

您关于有效日期的约定似乎是,一行的有效期从生效日期(包括生效日期00:00:00)到到期日期(包括到期日期23:59:59)。因此,更新这些日期的代码必须在同一天设置一个更早的、现在完全无效的更新:

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

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

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

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

相关内容

最新更新