| 初始化 | 全量快照落一层: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;重跑当天任务时必须先回到当日开始前的状态或保证逻辑幂等,否则重复关链会写坏区间。