我正在从事一个数据仓库项目,该项目将涉及集成来自多个源系统的数据。我已经设置了一个SSIS包,它填充客户维度,并使用缓慢变化的维度工具来跟踪客户的更新。
我遇到了一些问题。举个例子:
源系统A可能有这样的记录:
名字,姓氏,邮政编码Jane, Doe, 14222
源系统B可能有一个相同客户端的记录,看起来像这样:
名字,姓氏,邮政编码Jane, Doe, Unknown
如果我首先从系统A导入记录,我将拥有名字、姓氏和种族。太好了。现在,如果我从系统B导入客户记录,我可以进行模糊匹配,以识别这是同一个人,并使用缓慢变化的维度工具来更新信息。但在这种情况下,我将失去邮政编码,因为"未知"将覆盖有效数据。
我想知道我是否以错误的方式处理这个问题。SCD工具似乎没有提供任何基于新数据是否有效有选择地更新属性的方法。合并语句会更好吗?我是否犯了一些根本的设计错误,而我却没有意识到?
谢谢你的建议!
根据我的经验,内置的SCD工具不够灵活,无法处理此需求。
无论是几个MERGE
语句,还是一系列UPDATE
和INSERT
语句,都可能为您提供最大的逻辑和性能灵活性。
对于SCD类型2的MERGE
语句可能有模型,但这里是我使用的模式:
Merge Target
Using Source
On Target.Key = Source.Key
When Matched And
Target.NonKeyAttribute <> Source.NonKeyAttribute
Or IsNull(Target.NonKeyNullableAttribute, '') <> IsNull(Source.NonKeyNullableAttribute, '')
Then Update Set SCDEndDate = GetDate(), IsCurrent = 0
When Not Matched By Target Then
Insert (Key, ... , SCDStartDate, IsCurrent)
Values (Source.Key, ..., GetDate(), 1)
When Not Matched By Source Then
Update Set SCDEndDate = GetDate(), IsCurrent = 0;
Merge Target
Using Source
On Target.Key = Source.Key
-- These will be the changing rows that were expired in first statement.
When Not Matched By Target Then
Insert (Key, ... , SCDStartDate, IsCurrent)
Values (Source.Key, ... , GetDate(), 1);