为何在GROUP BY中添加列会使SUM()的结果增大?
为什么GROUP BY添加列后
sum(count(distinct ID))的结果会变大? 嘿,这个问题的核心是分组粒度的变化对count(distinct)统计逻辑的影响,咱们结合你的例子一步步拆解清楚:
首先从你给出的结果反推,你的table1里应该存在这样的情况:同一个日期+ID组合,对应了不同的Column2值——比如某一天里,ID=1既出现在Column2=Yes的记录里,也出现在Column2=No的记录里。
第一个查询的执行逻辑
你执行的第一个语句:
select date, sum(Result_of_count) from (select date, count(distinct ID) as Result_of_count from table1 group by date) group by date
这里子查询的分组粒度是仅按date:
- 对于每个日期,不管
Column2是什么,只统计这个日期下所有不同ID的数量(每个ID在该日期下只被计数一次) - 外层
sum把每个日期的计数值加总,最终得到10。
第二个查询的执行逻辑
当你在子查询的GROUP BY中添加column2后,语句变成:
select date, sum(Result_of_count) from (select date, column2, count(distinct ID) as Result_of_count from table1 group by date, column2) group by date
这里子查询的分组粒度变成了**date + column2的组合**:
- 对于每个
日期+Column2的分组,统计该分组下不同ID的数量 - 如果同一个ID在同一个日期的不同Column2分组里都有记录,这个ID会在每个对应的分组里各被计数一次(比如ID=1在2022-01-01的Yes分组里计1,No分组里也计1)
- 外层
sum把这些分组的计数值全部加起来,自然就会比第一个查询的结果大——因为原本在单个日期里只被计一次的ID,现在被拆分到多个Column2分组里重复计数了。
举个更具体的小例子帮助理解:
假设table1里有如下记录:
| Date | ID | Column2 |
|---|---|---|
| 01-01-2022 | 1 | Yes |
| 01-01-2022 | 1 | No |
| 01-01-2022 | 2 | Yes |
第一个子查询group by date的结果是:
| Date | count(distinct ID) |
|---|---|
| 01-01-2022 | 2 |
sum后这部分是2。
第二个子查询group by date, column2的结果是:
| Date | Column2 | count(distinct ID) |
|---|---|---|
| 01-01-2022 | Yes | 2 |
| 01-01-2022 | No | 1 |
sum后这部分是2+1=3,比第一个结果多了1——原因就是ID=1在Yes和No两个分组里各被计了一次,被重复加总了。
回到你的例子,结果从10变成13,说明有3次这样的重复计数情况(比如3个ID在同一个日期的不同Column2分组里被分别计数)。
内容的提问来源于stack exchange,提问作者condexter
相关产品推荐
相关产品推荐

