一批多天变更怎么合并
批处理窗口里同一个自然键可能出现多次变更,例如三天内改了两次地址。如果逐条处理,就会生成同一生效日期的多行版本,既浪费空间又让关联出现歧义。正确做法是按自然键取窗口内的最后一条状态,生效日期统一取批次日。
基本信息
| 合并规则 | 按自然键取窗口内最后一条(更新时间倒序取第一行) |
|---|---|
| 生效日期 | 统一取批次日或窗口结束日 |
| 实现方式 | 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;合并参数约定
| 参数 | 取值 | 说明 |
|---|---|---|
| 窗口范围 | 左闭右开 | 避免相邻窗口重复处理同一条 |
| 生效日期 | 统一用批次日 | 保证同一批次只产出一个版本 |
| 排序字段 | 源端更新时间 | 缺失时用自增序列兜底 |
| 去重粒度 | 自然键 | 代理键此时尚未生成 |
事件时间与批次时间要分清:生效日期用事件时间会让同一批产出多行,用批次日则只有一行,两种选择必须与业务确认后写进口径。
窗口用左闭右开:两端都闭或都开会让边界数据被处理两次或漏掉一次,而且问题只在特定日期出现,很难发现。