SQL中新增GROUP BY分组列为何会改变统计结果?
新增GROUP BY列导致统计结果差异的原因
首先排查最明显的字段不一致问题
对比两个查询的WHERE子句:
- 查询1过滤的是
date字段:WHERE EXTRACT(year FROM date) = 2022 and EXTRACT(month FROM date) = 08 - 查询2过滤的是
activity_date字段:WHERE EXTRACT(year FROM activity_date) = 2022 and EXTRACT(month FROM activity_date) = 08
如果date和activity_date是不同的业务字段(比如一个是模板创建日期,一个是邮件操作日期),两个查询的数据源本身就不一样,统计结果自然会有差异。这是最优先要检查的点。
分组粒度变化引发的逻辑问题
当你在GROUP BY中新增quarter和week后,分组粒度从template+url+年+月变成了template+url+年+季度+月+周,原本属于同一大组的数据会被拆分成多个更小的组,这时候可能出现两种情况:
1. 原查询的GROUP BY语法错误导致统计失真
看查询1的GROUP BY子句:GROUP BY 1,2,3,4,5,6,但对应的SELECT列里,第5、6位是聚合函数计算的列(COUNT(distinct(email_template))和count(CASE WHEN action = 'Sent' then id else NULL end))。按照SQL标准,GROUP BY只能包含非聚合的分组字段,不能包含聚合结果。
如果你的数据库允许这种错误语法(比如MySQL的宽松模式),会导致分组逻辑异常:数据库可能会错误地重复统计某些数据,或者随机聚合,最终让sent的总和虚高(比如你看到的48k)。而查询2的GROUP BY对应的是前6个非聚合列,语法正确,统计结果更准确(47k)。
2. 细分组后出现的sent=0行被Excel忽略
当分组变细后,某些新的小组可能没有action='Sent'的记录,此时sent字段会返回0。如果你的Excel在求和时默认过滤了值为0的行,或者因为bounces/sent计算时出现NULL(当sent=0时,除法无意义)导致这些行被隐藏,最终求和的总数就会减少。
验证建议
- 先确认
date和activity_date是否为同一字段,修正查询中的字段不一致问题; - 修正查询1的
GROUP BY,只保留非聚合列:GROUP BY 1,2,3,4,再对比两个查询的sent总和; - 导出查询2的全部结果,检查是否存在
sent=0的行,确认Excel求和时是否包含这些行。
内容的提问来源于stack exchange,提问作者Fiz
相关产品推荐
相关产品推荐

