订单在多片各有一份归档副本,统计近 30 天单量时用 union all 合并,结果比实际多 27 条,换成 union 又少了 4 条。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,union all 保留重复,副本越多重复越多。union 会整行去重,但两边的 updated_at 不同,同一订单被当成两行,另外 4 条因为字段被截断反而被合并掉。

「跨片聚合去重」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

SELECT count(*) FROM (
  SELECT order_no, row_number() OVER (PARTITION BY order_no ORDER BY updated_at DESC) rn
  FROM t_order_all
) t WHERE rn = 1;

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,先按业务主键去重再计数 不要依赖整行 union;用 row_number 按 order_no 分组取最新一条;归档副本加来源标记 统计时只取一个来源;核对总数时和明细清单一起看。

最后用这个标准收尾,统计结果和订单明细导出一致 重复的 27 条不再计入。

作者 9823189