首页/数据/数据工程与 ETL 速查/缓慢变化维 Type 2:版本化保留历史

缓慢变化维 Type 2:版本化保留历史

Type 2 在属性变化时关闭当前版本、插入新版本行,用生效起止区间区分;事实表引用当时的代理键,因此历史指标可以按当时口径复现,是数仓常用的历史保留方式。

字段代理键、业务键、属性、start_date、end_date、is_current
变化处理旧行关链、新增一行
事实关联写入时取当时生效的代理键
支持按历史属性回溯分析

两段式维护(关链加新增)

两段式维护(关链加新增)
-- 1) 关闭发生变化的当前版本
UPDATE dim_user SET end_date = DATE '2026-10-11', is_current = false
WHERE user_id IN (SELECT user_id FROM stg_user_changed) AND is_current = true;

-- 2) 插入新版本
INSERT INTO dim_user (user_sk, user_id, user_name, city, level, start_date, end_date, is_current)
SELECT seq_user_sk.NEXTVAL, user_id, user_name, city, level,
       DATE '2026-10-11', DATE '9999-12-31', true
FROM stg_user_changed;
事实表写入时要按事件时间匹配生效中的维度版本,而不是简单取 is_current = true,否则补历史数据会取到新版本。

易错点

  • 补历史分区时用当前版本维度回刷,历史口径被污染
  • end_date 用极限日期与用 NULL 混用,关联条件写法不一致

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》SCD Type 2
  • 行业数仓拉链表实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌