使用COUNT(*)聚合函数筛选PostgreSQL查询结果的问题
解决PostgreSQL中聚合结果的过滤问题
正确解法1:使用HAVING子句(直接调用聚合函数)
你需要将HAVING子句放在GROUP BY之后、ORDER BY之前,并且直接使用聚合函数表达式(而非SELECT里定义的别名,PostgreSQL v12不支持在HAVING中引用SELECT阶段的别名):
SELECT player01, player02, COUNT(*) AS score_count FROM results GROUP BY player02, player01 HAVING COUNT(*) > 4 ORDER BY score_count DESC, player01 ASC LIMIT 10;
正确解法2:子查询过滤(用别名更直观)
如果想通过score_count别名来过滤,可以先通过子查询完成聚合计算,再在外层用WHERE筛选结果:
SELECT * FROM ( SELECT player01, player02, COUNT(*) AS score_count FROM results GROUP BY player02, player01 ) AS grouped_data WHERE score_count > 4 ORDER BY score_count DESC, player01 ASC LIMIT 10;
为什么之前的尝试会出错?
- WHERE子句作用于分组前的原始行,此时聚合计算还未执行,所以既无法引用聚合后的别名(
score_count还不存在),也不能在WHERE中直接使用聚合函数(PostgreSQL语法规则不允许)。 - 你之前用
HAVING score_count >4报错,是因为PostgreSQL v12的HAVING阶段无法识别SELECT子句定义的别名,必须直接写聚合函数表达式。 - 将WHERE放在ORDER BY之后属于语法错误,SQL语句的执行顺序要求WHERE必须在FROM之后、GROUP BY之前,HAVING在GROUP BY之后、ORDER BY之前。
内容的提问来源于stack exchange,提问作者Tommy Gibbons
相关产品推荐
相关产品推荐

