失效成员又出现怎么办
已失效的维度成员重新出现在源端时,不要复用旧的版本行,而是插入一段新的生效区间并把当前标志置为有效。直接修改旧行的结束日期会篡改历史:那段时间该成员客观上并不存在,回溯报表时会出现被凭空延长的生命周期。
基本信息
| 检测信号 | 成员重新出现在源端增量数据里 |
|---|---|
| 处理动作 | 插入新的生效区间,旧区间保持不变 |
| 当前标志 | 新区间置为当前,旧区间已关闭 |
| 风险点 | 与迟到数据修订规则混淆,同一成员反复开合 |
| 区间写法 | 建议左闭右开,避免边界重叠与空档 |
典型使用场景
- 会员重新激活:注销后重新注册,历史活跃期不应被改写
- 门店重新开业:闭店期间的零销售额是必须保留的事实
- 供应商恢复合作:合作中断期不计入有效供应商数
- 资产重新投用:停用后重新启用,资产生命周期需要完整
- 审计要求:任何时点的成员状态都必须能还原
重新激活的处理
重新激活的处理
-- 成员重新出现:新起一段生效区间,不改历史行
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 的标准动作 |
| 成员彻底删除 | 标记失效并关闭区间 | 保留历史事实的关联能力 |
重新激活与迟到修订要用业务规则区分:判断依据是源系统是否会恢复已停用记录,规则不清会让同一成员反复开合,版本数量失控。
起止日期建议左闭右开:关联条件写成大于等于起始、小于结束,能避免边界重叠,也不会在区间交界处丢掉一天的数据。