跨表一致性稽核是什么
跨表稽核把同一事实在两张表上的汇总值做比对:主表与明细、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 维度低时总量可能正好抵消,稽核通过但报表已经错了,因此必须按维度下钻。