支持SCD2的表发生SCD1变更时应当更新哪些记录?
混合SCD1/SCD2维度下SCD1属性变更的标准处理规则
官方标准结论
Kimball团队在《数据仓库工具箱》系列著作中明确给出了标准处理逻辑:当SCD1属性发生变更时,需要更新该业务键对应的所有维度行,包含历史过期版本、当前活跃版本、提前预制的未来生效版本。微软官方的SQL Server、Azure Synapse数据仓库相关文档中对SCD1的处理规则和上述定义完全一致。
核心依据
- SCD1属性的核心设计目标就是不保留历史变更,任意时间、任意版本下该属性都仅返回最新值。如果仅更新当前活跃版本,相当于为SCD1属性也保留了变更历史,本质是将其作为SCD2属性处理,违背了SCD1的设计初衷。
- 你提到的
COUNT(DISTINCT 业务键)和COUNT(DISTINCT SCD1属性)结果一致的诉求完全符合标准逻辑:SCD1属性和业务键为一一对应关系,全量更新所有版本才能保证二者统计口径统一。
特殊场景处理
- 无当前活跃版本的业务键:哪怕该业务对象的所有维度行都已过期,依然要全量更新所有行的SCD1属性。比如已离职员工的籍贯(SCD1属性)发生变更,所有历史任职记录的籍贯都要同步更新为最新值,符合SCD1不保留历史的特性。
- 提前预制的未来生效版本:未来版本的SCD1属性同样要同步更新,不需要额外做特殊处理,符合SCD1全版本统一的规则。
仅更新当前版本的适用场景
如果你们团队明确约定SCD1属性仅需要在当前活跃版本生效、历史版本保留变更前的值,属于自定义SCD处理规则,不属于标准SCD1范畴。这种情况需要在数据字典中明确标注该属性的非标准处理逻辑,避免下游数据使用时出现口径歧义。
内容的提问来源于stack exchange,提问作者Ralf
相关产品推荐
相关产品推荐

