我正在开发一个数据仓库项目,该项目涉及集成来自多个源系统的数据。我已经设置了一个SSIS包,用于填充客户维度,并使用缓慢变化的维度工具来跟踪客户的更新。
我遇到了一些问题。举个例子:
源系统A可能有如下记录:
名字,姓氏,邮政编码 Jane,Doe,14222
源系统B可能具有相同客户端的记录,如下所示:
名字,姓氏,邮政编码 Jane,Doe,Unknown
如果我首先从系统A导入记录,我将使用名字,姓氏和种族。大。现在,如果我从系统B导入客户端记录,我可以进行模糊匹配,以识别这是同一个人并使用缓慢变化的维度工具来更新信息。但在这种情况下,我将丢失邮政编码,因为“未知”'将覆盖有效数据。
我想知道我是否以错误的方式接近这个问题。 SCD工具似乎无法根据新数据是否有效提供任何选择性更新属性的方法。合并声明会更好吗?我是否犯了一些我没有看到的基本设计错误?
感谢您的任何建议!
答案 0 :(得分:0)
根据我的经验,内置的SCD工具不够灵活,无法满足这一要求。
一些MERGE
语句或一系列UPDATE
和INSERT
语句可能会为您提供最大的逻辑和性能灵活性。
对于SCD Type 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);