首页/数据/数仓建模速查/SCD 批量窗口与同批变更合并
维度与事实设计149 条

SCD 批量窗口与同批变更合并

一批处理多天变更时,对同一自然键只保留窗口内最后状态并统一生效日期,避免同一批次生成多行版本。

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

一批多天变更怎么合并

批处理窗口里同一个自然键可能出现多次变更,例如三天内改了两次地址。如果逐条处理,就会生成同一生效日期的多行版本,既浪费空间又让关联出现歧义。正确做法是按自然键取窗口内的最后一条状态,生效日期统一取批次日。

基本信息

合并规则按自然键取窗口内最后一条(更新时间倒序取第一行)
生效日期统一取批次日或窗口结束日
实现方式row_number 按自然键分区排序后取第一行
例外情况业务要求一天一版本时按天分桶推进
风险点事件时间与批次时间混用,区间互相嵌套

典型使用场景

  • 日批加载:一天内多次变更只保留日终状态
  • 补数窗口:一次补三天数据时按最后状态落一个版本
  • 多源合并:同一实体在多个源的变更在同一批内合并
  • 性能控制:减少版本数量,降低下游关联成本
  • 区间校验:合并后检查区间不重叠、没有空洞

窗口内取末条

窗口内取末条
-- 窗口取末条:同一自然键只保留最新状态
SELECT * FROM (
  SELECT s.*,
         row_number() OVER (
           PARTITION BY customer_id
           ORDER BY update_ts DESC
         ) AS rn
  FROM stg_customer
  WHERE update_ts >= :w_start
    AND update_ts < :w_end
) t
WHERE rn = 1;

合并参数约定

参数取值说明
窗口范围左闭右开避免相邻窗口重复处理同一条
生效日期统一用批次日保证同一批次只产出一个版本
排序字段源端更新时间缺失时用自增序列兜底
去重粒度自然键代理键此时尚未生成
事件时间与批次时间要分清:生效日期用事件时间会让同一批产出多行,用批次日则只有一行,两种选择必须与业务确认后写进口径。
窗口用左闭右开:两端都闭或都开会让边界数据被处理两次或漏掉一次,而且问题只在特定日期出现,很难发现。

易错点

  • 同批多行逐条处理:出现同一生效日期的多个版本,关联时产生歧义
  • 事件时间与批次时间混用:区间互相嵌套,时长统计出现负数
  • 窗口边界处理不当:边界数据重复处理或漏处理
  • 排序字段选择不当(无更新时间):同批顺序随机,版本内容不稳定
  • 合并后不做区间连续性检查:重叠与空洞进入维度表,事后极难修复

数据来源与参考

  • 数仓实践:批次化维度加载
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌