SQL查询:如何筛选分组平均价高于全局总均价的类别
问题原因
- 聚合函数的执行时机晚于
WHERE子句的过滤逻辑,因此不能直接在WHERE中使用AVG()这类聚合函数做过滤条件,过滤聚合结果需要使用HAVING子句。 - 全局均价是全表聚合的结果,可以单独通过一个标量子查询提前计算出来,不需要额外写关联逻辑增加复杂度。
正确SQL写法
简洁版写法(推荐)
直接在分组后通过HAVING对比分组均价和全局均价即可:
SELECT t, AVG(q) AS avg_group FROM a GROUP BY t HAVING AVG(q) > (SELECT AVG(q) FROM a);
原写法调整版
如果要保留你原来的关联逻辑写法,提前把全局均价单独计算出来关联即可:
SELECT b.t, b.AvgQ as avg_group FROM (SELECT AVG(q) as AvgQ, t FROM a GROUP BY t) b CROSS JOIN (SELECT AVG(q) as global_avg FROM a) g WHERE b.AvgQ > g.global_avg;
结果验证
执行上述任意一种SQL,返回结果都和你预期的完全一致:
t | avg_group --+---------- 1 | 6
内容的提问来源于stack exchange,提问作者Oliver Kanner
相关产品推荐
相关产品推荐

