关于GROUP BY与HAVING子句中聚合函数访问单元格的疑问
问题解答
你误解了GROUP BY的作用逻辑:GROUP BY只是把相同candidate_id的行归为一个逻辑分组,并没有将分组内的原始数据"聚合消失"——每个分组依然保留着该候选人对应的所有原始skill行数据,聚合函数的工作就是遍历分组内的每一行原始记录,执行计算后得到汇总结果。
拿你提供的SQL举例:
Select candidate_id from candidates group by candidate_id having sum(if(lower(skill)='python' or lower(skill)='tableau',1,0))=3
实际执行流程是:
- 按
candidate_id对所有行分组,每个分组包含该候选人的全部skill记录; - 针对每个分组,执行
sum(...)操作:遍历分组内的每一行,检查该行的skill是否为Python或Tableau,符合条件则记1,不符合记0,最后将这些数值求和; HAVING子句用这个求和结果做筛选,只保留求和等于3的分组对应的candidate_id。
你忽略的核心点是:GROUP BY只是完成了行的分组归类,并没有提前将分组内的原始字段合并为单一值。HAVING子句里的聚合函数,本质是在分组完成后,基于分组内的每一条原始记录做计算汇总,再用这个汇总结果筛选分组。
另外补充:HAVING和WHERE的核心区别是执行时机——WHERE在分组前筛选行,HAVING在分组后用聚合结果筛选分组,但两者都能基于原始字段进行判断(WHERE直接使用,HAVING通过聚合函数间接使用)。
内容的提问来源于stack exchange,提问作者Suhail
相关产品推荐
相关产品推荐

