首页/数据/数仓建模速查/SCD2 合并模板:源到维度增量
维度与事实设计149 条

SCD2 合并模板:源到维度增量

可复用的三步骤模板:变更识别 → 关闭旧版本 → 插入新版本;用 hashdiff 比对新旧属性,配合批次水位实现按批增量。

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

SCD2 合并模板是什么

SCD2 合并模板把拉链维表的增量更新固定成三段:变更识别、关闭旧版本、插入新版本。变更识别用 hashdiff 或逐列比较,配合源端水位只读增量数据;关闭旧版本写 end_date 并把当前标志置 0;插入新版本时同一批次统一取批次日期作为 start_date,避免同一批生成多个小版本。三段必须在同一批次内完成且可重复执行,否则会出现版本区间重叠或断档。

基本信息

三步识别变更、关闭旧行、插入新行
水位用源端 last_load_ts 或批次号过滤增量
批次日期同批统一取一个 start_date,防止多小版本
幂等按批次记录来源,重跑结果一致
前置条件自然键唯一、已有 hashdiff 列与 is_current 标志

典型使用场景

  • 新建拉链维表:按模板落地增量作业,避免每次重新设计
  • 批量改造:把历史逐列比较写法统一替换为模板,降低漏列风险
  • 调度重跑:作业失败后按批次号重跑,结果与首次一致
  • 批次合并:一天多批数据统一取当日日期作为 start_date
  • 多表复用:客户、商品、门店维度共用同一套模板,只在配置里换表名
  • 问题复盘:版本区间异常时按三步逐段排查,定位是哪一环出的问题

三步模板

三步模板
-- 步骤 1:标出变更的自然键(增量读源 + 哈希比较)
WITH src AS (
  SELECT customer_id, name, phone,
         md5(concat_ws('|', coalesce(name,'#'), coalesce(phone,'#'))) AS row_hash
  FROM   stg_customer
  WHERE  load_ts > :last_load_ts),
chg AS (
  SELECT s.customer_id
  FROM   src s
  JOIN   dim_customer d
    ON   s.customer_id = d.customer_id AND d.is_current = 1
  WHERE  s.row_hash <> d.row_hash)
-- 步骤 2:关闭旧版本(条件必须带 is_current = 1)
UPDATE dim_customer d
JOIN   chg c ON d.customer_id = c.customer_id
SET    d.end_date = :batch_date - interval '1' day,
       d.is_current = 0
WHERE  d.is_current = 1;

-- 步骤 3:插入新版本,同批统一 start_date
INSERT INTO dim_customer
      (customer_sk, customer_id, name, phone, row_hash,
       start_date, end_date, is_current)
SELECT next_sk(), s.customer_id, s.name, s.phone, s.row_hash,
       :batch_date, '9999-12-31', 1
FROM   src s JOIN chg c ON s.customer_id = c.customer_id;

实现方式对照

方式特点风险
MERGE 单语句原子性好,逻辑集中部分引擎对同表读写支持有限
三步 SQL 事务通用性最好忘记事务包裹会留下中间态
全量重算实现最简单成本随历史增长,且有停用窗口
视图按需计算无需物理拉链大表查询慢,无法支撑高频报表
流式增量时效最好乱序与重复事件处理复杂
同批统一取批次日期是一个容易被忽略但很关键的细节:若逐行取 current_timestamp,同一批数据会生成时间相差毫秒的多个版本,区间看似连续实际碎片化,后续按区间查询与校验都会变得难以解释。

易错点

  • 逐列比较漏列:属性改了却不产生新版本,值被静默丢弃
  • 同批先插入后关闭:新旧版本区间重叠,出现两条当前行
  • 关闭旧行漏写 is_current = 1:把该自然键全部历史行一起关闭
  • 逐行取当前时间做 start_date:同一批碎片化成多个小版本,区间校验失效
  • 无水位过滤且无幂等:重跑把已处理的增量再插一遍,版本翻倍

数据来源与参考

  • 数据仓库工具箱:缓慢变化维增量加载
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌