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