缓慢变化的维度 - 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'
我正在使用 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'