跨表一致性稽核

跨表稽核把同一事实在两张表的汇总值比对:主表与明细、DWD 与 DWS、DWS 与 ADS;差异按业务维度下钻定位,避免只看总数掩盖局部偏差。

跨表一致性稽核是什么

跨表稽核把同一事实在两张表上的汇总值做比对:主表与明细、DWD 与 DWS、DWS 与 ADS。做法是先比总量、再按业务维度下钻,避免只看总数掩盖局部偏差——A 类目偏高、B 类目偏低时总数可能完全相等。它是数仓加工链路最有效的自检手段,因为绝大多数加工错误(漏行、重复、关联丢行)都会在层级之间的比对里现形。

基本信息

比对对象主表与明细、明细与汇总、数仓与报表、源端与目标端
粒度先总量后按维度下钻,最后定位到具体实体
容差金额按 0.01 元级别,计数类应严格为 0
时间口径两侧必须使用同一时间口径(都按支付时间或都按创建时间)
结果留存差异结果落稽核表并跟踪关闭状态
执行时机紧跟在加工任务之后,避免下游在错误数据上继续加工

典型使用场景

  • 分层校验:DWD 聚合结果与 DWS 汇总表逐日比对
  • 主表与明细核对:订单主表金额与明细行金额合计是否一致
  • 维表关联检查:关联前后行数与金额变化是否在预期范围内
  • 报表核对:ADS 结果与底层汇总表数字一致,避免展示层错位
  • 回补验收:回刷历史分区后用同一套比对确认结果正确

汇总值与明细合计比对

汇总值与明细合计比对
-- 按维度比对,避免总量相互抵消掩盖局部偏差
SELECT a.dt, a.category,
       a.pay_amt AS dws_amt, b.pay_amt AS detail_amt,
       ROUND(a.pay_amt - b.pay_amt, 2) AS diff
FROM dws_trade_category_1d a
JOIN (
  SELECT dt, category, SUM(pay_amount) AS pay_amt
  FROM dwd_trade_order_detail_di
  WHERE dt = '2026-10-11'
  GROUP BY dt, category
) b ON a.dt = b.dt AND a.category = b.category
WHERE a.dt = '2026-10-11'
  AND ABS(a.pay_amt - b.pay_amt) > 0.01;

关联前后行数检查

关联前后行数检查
-- 关联维表前后对比:右表未匹配会造成行数减少,维表多版本会造成行数膨胀
SELECT COUNT(1) AS raw_cnt,
       COUNT(u.user_sk) AS matched_cnt,
       COUNT(1) - COUNT(u.user_sk) AS lost_cnt
FROM dwd_trade_order_detail_di o
LEFT JOIN dim_user u ON o.user_sk = u.user_sk AND u.is_current = 1
WHERE o.dt = '2026-10-11';

差异形态与含义

差异形态常见原因排查方向
总量一致但维度互换分类映射或分组条件不同按维度下钻逐类比对
明细偏多上游重跑叠加、关联造成膨胀查粒度唯一性与维表多版本
明细偏少关联丢行、过滤条件过紧检查连接键类型与过滤条件
两侧时间口径不同一边按支付时间一边按创建时间先统一口径再比对
零星小额差异精度与舍入规则不一致统一小数位与四舍五入方式
跨表稽核要在同一时间口径下进行:一边按支付时间、一边按创建时间,差异会来自口径而不是数据,把口径问题当数据问题排查会浪费大量时间。
只比对总量是最常见的偷懒做法:A 维度高、B 维度低时总量可能正好抵消,稽核通过但报表已经错了,因此必须按维度下钻。

易错点

  • 只比对总量,局部维度互换(一类偏高另一类偏低)无法被发现
  • 两边时间口径不一致,产生大量伪差异,真实问题被噪声淹没
  • 稽核放在当天所有任务之后才跑,错误数据已经流向报表
  • 差异结果不做留存与跟踪,反复出现同一处差异却无人闭环
  • 关联维表未限当前生效版本,行数膨胀被当成上游数据增加

数据来源与参考

  • 行业数据质量跨表稽核实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌