SQL GROUP BY分组后同event_key出现多行?如何定位导致拆分的列
解决方案
方法1:抽样排查(适合字段少的场景)
- 第一步先找出所有出现多分组的异常event_key:
SELECT event_key, COUNT(*) OVER (PARTITION BY event_key) AS row_per_event FROM 你的业务表名 QUALIFY row_per_event > 1 LIMIT 20;
要是你用的数据库不支持
QUALIFY语法,换成子查询加WHERE过滤即可:
SELECT event_key FROM ( SELECT event_key, COUNT(*) AS row_per_event FROM 你的业务表名 GROUP BY event_key ) t WHERE row_per_event > 1 LIMIT 20;
- 第二步随便取一个异常的event_key值,查询该key下所有分组字段的去重结果,直接比对差异:
SELECT DISTINCT c1, c2, c3 -- 把你GROUP BY里除了event_key的所有字段都列在这里 FROM 你的业务表名 WHERE event_key = '你选的异常event_key值';
返回的多行结果中,值不一样的列就是导致分组拆分的列。
方法2:批量统计(适合字段多的场景)
直接按event_key分组,统计每个分组字段的去重数,大于1的就是异常列:
SELECT event_key, COUNT(DISTINCT c1) AS cnt_c1, COUNT(DISTINCT c2) AS cnt_c2, COUNT(DISTINCT c3) AS cnt_c3 -- 所有GROUP BY字段都按该格式添加 FROM 你的业务表名 GROUP BY event_key HAVING COUNT(*) > 1 -- 只保留出现多分组的异常event_key LIMIT 10;
结果中cnt_xxx大于1的xxx字段,就是数值不统一的列。
常见隐藏差异点
如果肉眼比对字段值看起来完全一致,大概率是以下隐性差异导致的:
- 字符串类型字段存在前后空格、不可见字符、大小写差异
- 浮点类型字段存在精度差异,比如
1.0和1.0000000001展示时被四舍五入看起来一致 - 空值和空字符串混淆,
NULL和''在SQL中是完全不同的值 - 日期时间类型的精度差异,比如带毫秒和不带毫秒的同一时间值
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

