为何SQL分组统计后去重客户端ID计数总和与直接去重计数结果不一致?
问题根源:同一个客户被多个分组重复计数啦!
这是个很典型的COUNT(DISTINCT)在分组与全局统计时的差异问题,核心原因是:同一个client_id可能对应多个不同的clienttype(包括NULL值),在分组统计时,这个客户会在每个对应的clienttype组里被各计一次,但全局统计时只会被算一次。
举个简单的例子就懂了:假设某个client_id=123在database2里有两条2021年的记录,一条clienttype='VIP',另一条clienttype='普通用户'。那第一个全局查询里,这个客户只会被算1次;但第二个分组查询里,VIP组会算1次,普通用户组也会算1次,求和时就变成了2次。大量这样的客户累加起来,就会让分组求和的结果(300k)远大于全局统计的结果(200k)。
你提到的NULL组的50k计数只是其中一部分,真正的大头是那些同时属于多个非NULLclienttype,或者同时属于NULL和非NULL类型的客户——他们被重复计入了多个分组的统计里。
验证这个结论的方法
你可以跑下面的SQL来找出那些跨多个clienttype的客户:
SELECT a.client_id, COUNT(DISTINCT b.clienttype) AS unique_types FROM database1 a INNER JOIN database2 b ON a.client_id = b.client_id AND b.year = 2021 GROUP BY a.client_id HAVING unique_types > 1
这个查询会返回所有在2021年对应多种clienttype的客户,他们就是导致两个结果差异的核心原因。
补充说明
本质上,COUNT(DISTINCT client_id)在分组查询中是每个分组内去重,而全局查询是整个结果集去重。当同一个client_id出现在多个分组时,分组求和就会把这个客户多次计算,而全局只会算一次,这就是差异的来源。
内容的提问来源于stack exchange,提问作者Soraqil
相关产品推荐
相关产品推荐

