首页/数据/数仓建模速查/SCD 维度成员重新激活
维度与事实设计149 条

SCD 维度成员重新激活

已失效成员重新出现时不要复用旧版本行,而是插入新的生效区间并置当前标志;直接改旧行 end_date 会篡改历史。

数仓建模速查数据更新于 2026-10-13

失效成员又出现怎么办

已失效的维度成员重新出现在源端时,不要复用旧的版本行,而是插入一段新的生效区间并把当前标志置为有效。直接修改旧行的结束日期会篡改历史:那段时间该成员客观上并不存在,回溯报表时会出现被凭空延长的生命周期。

基本信息

检测信号成员重新出现在源端增量数据里
处理动作插入新的生效区间,旧区间保持不变
当前标志新区间置为当前,旧区间已关闭
风险点与迟到数据修订规则混淆,同一成员反复开合
区间写法建议左闭右开,避免边界重叠与空档

典型使用场景

  • 会员重新激活:注销后重新注册,历史活跃期不应被改写
  • 门店重新开业:闭店期间的零销售额是必须保留的事实
  • 供应商恢复合作:合作中断期不计入有效供应商数
  • 资产重新投用:停用后重新启用,资产生命周期需要完整
  • 审计要求:任何时点的成员状态都必须能还原

重新激活的处理

重新激活的处理
-- 成员重新出现:新起一段生效区间,不改历史行
INSERT INTO dim_customer
  (customer_id, name, start_date, end_date, is_current)
VALUES (:customer_id, :name, :batch_dt, '9999-12-31', 1);

-- 前提:旧区间已正常关闭,两段区间不重叠
-- UPDATE dim_customer SET end_date = :batch_dt, is_current = 0
-- WHERE customer_id = :customer_id AND is_current = 1;

四种动作的区分

场景处理方式原因
成员重新出现新起生效区间历史区间不能被改写
迟到数据修订回写对应历史区间补的是当时本应存在的状态
属性变更关闭旧区间并开新区间SCD2 的标准动作
成员彻底删除标记失效并关闭区间保留历史事实的关联能力
重新激活与迟到修订要用业务规则区分:判断依据是源系统是否会恢复已停用记录,规则不清会让同一成员反复开合,版本数量失控。
起止日期建议左闭右开:关联条件写成大于等于起始、小于结束,能避免边界重叠,也不会在区间交界处丢掉一天的数据。

易错点

  • 改写旧行结束日期来复用:历史区间被凭空延长,期间报表失真
  • 复活与迟到修订规则不清:同一成员反复开开合合,版本数量爆炸
  • 新区间与旧区间日期重叠:时点关联出现两行,计数翻倍
  • 复活时不更新当前标志:一个自然键出现两个当前行
  • 把失效成员直接删除:历史事实关联断裂,无法追溯

数据来源与参考

  • Kimball Group:缓慢变化维技术
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌