首页/数据/数据工程与 ETL 速查/拉链表增量维护 SQL

拉链表增量维护 SQL

拉链维护三步:找出变化实体(与最新快照比对)、关闭旧链、插入新链;每日增量执行,首次用全量快照初始化。

初始化全量快照落一层:start_date=首次日期,end_date=极限值
变更检测与最新有效版本比对属性差异
关链变化行 end_date 改为新版本起始日
开链变化行插入新版本

变更检测、关链与开链

变更检测、关链与开链
-- 1) 变更检测
CREATE TABLE tmp_user_change AS
SELECT s.user_id, s.city, s.level
FROM ods_user_full s
JOIN dim_user_zip z ON s.user_id = z.user_id AND z.end_date = DATE '9999-12-31'
WHERE s.city <> z.city OR s.level <> z.level;

-- 2) 关链(整表重写,避免 UPDATE 成本)
INSERT OVERWRITE TABLE dim_user_zip
SELECT user_id, city, level, start_date,
       CASE WHEN user_id IN (SELECT user_id FROM tmp_user_change)
            THEN DATE '2026-10-11' ELSE end_date END AS end_date
FROM dim_user_zip;

-- 3) 开链
INSERT INTO dim_user_zip
SELECT user_id, city, level, DATE '2026-10-11', DATE '9999-12-31' FROM tmp_user_change;
重跑当天任务时必须先回到当日开始前的状态或保证逻辑幂等,否则重复关链会写坏区间。

易错点

  • 变更检测遗漏新增属性,维度新增字段后拉链不再更新
  • 关链日期与开链日期错开一天,出现当天无版本的区间空洞

数据来源与参考

  • 阿里《大数据之路:阿里巴巴大数据实践》拉链表加工
  • 行业数仓拉链维护实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌