唯一性校验

唯一性校验确认业务键在目标粒度上不重复:按主键分组计数大于 1 即为重复;重复主要来自上游重跑叠加、关联放大与去重键选错。

唯一性校验查什么

唯一性校验确认业务键在目标粒度上不重复:按主键分组计数,大于 1 就说明存在重复。重复的来源主要有三类——上游任务重跑叠加(用追加写而不是覆盖写)、关联放大(一对多 join 把行数放大)、去重键选错(漏掉明细序号这类细分字段)。所以发现重复时先定位来源,才能保证明天不会再犯。

基本信息

检测方法业务键 GROUP BY 加 HAVING COUNT(1) > 1
常见粒度订单号、订单号加明细序号、日期加实体
输出内容重复组数与多出来的行数
处置思路定位上游是重复写入、关联放大还是源端重复

典型使用场景

  • 明细层主键校验:订单号加明细序号应当唯一
  • 汇总层校验:日期加维度组合应当唯一
  • 同步链路核对:目标表有没有因重复消费产生双份数据
  • 上游重跑后复核:确认覆盖写生效、没有叠加
  • 物化视图与缓存表:确认刷新逻辑不会累积历史行

重复检测

重复检测
SELECT order_id, item_no, COUNT(1) AS c
FROM dwd_trade_order_detail_di
WHERE dt = '2026-10-11'
GROUP BY order_id, item_no
HAVING COUNT(1) > 1
ORDER BY c DESC
LIMIT 20;

重复总量统计

重复总量统计
SELECT COUNT(1) AS dup_groups, SUM(c - 1) AS extra_rows
FROM (
  SELECT order_id, item_no, COUNT(1) AS c
  FROM dwd_trade_order_detail_di WHERE dt='2026-10-11'
  GROUP BY order_id, item_no HAVING COUNT(1) > 1
) t;

重复来源与特征

来源特征解法
上游重跑追加重跑当天的行数翻倍改成分区覆盖写入
关联放大行数与被关联表的重复数成比例先聚合再关联,或改用唯一键
重复消费同一批次被处理两次消费端幂等,并校验位移回退
源端重复源系统本身产生两笔确认业务合理性,必要时按规则合并
发现重复先别急着去重:掩盖掉重复却不去定位来源,明天还会重现,而且问题会从「能看见」变成「看不见」。
去重键要与粒度对齐:明细表漏掉明细序号会把正常的多行明细判成重复;反过来把明细序号也当主键去重,又会掩盖真正的重复订单。
唯一性规则要按表的粒度分别配置,而不是全库一个模板:明细表、汇总表、快照表的主键组合本来就不同,用同一套规则会在某些表上永远误报。规则清单建议随建表一起提交评审,避免上线后才发现口径对不上。

易错点

  • 用 DISTINCT 掩盖重复,掩盖了上游双写的事实,问题被推到更下游
  • 去重键选错(漏掉明细序号),把正常的多行明细判定为重复
  • 校验 SQL 只统计重复组数不统计多出来的行数,无法判断影响规模
  • 唯一性规则只在报表层做,明细层的重复一路带到指标口径里

数据来源与参考

  • Kimball《The Data Warehouse Toolkit》粒度与唯一性
  • 行业数据质量校验实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌