PostgreSQL查询利润高于平均值的记录返回空结果问题求助
问题分析与解决方案
原查询返回空结果的原因
你的查询逻辑存在两个关键错误:
- 分组方式错误:使用
GROUP BY product_id, profit时,由于id(即你写的product_id)是唯一值,每个分组仅包含单条记录,此时AVG(profit)计算的是当前分组(单条记录)的利润平均值,也就是这条记录自己的profit值。 - 条件判断无效:因为你的
profit都是整数型的数值(如6.00、3.00),AVG(profit)::INT会将当前记录的profit转为整数,此时profit > AVG(profit)::INT等价于6.00 > 6、3.00 > 3这类不成立的判断,因此没有符合条件的记录返回。
正确查询语句
要筛选出利润高于全表平均利润的记录,需要先计算全局平均利润,再进行筛选,以下是两种可行写法:
写法1:子查询获取全局平均
SELECT id AS product_id, profit FROM products WHERE profit > (SELECT AVG(profit) FROM products);
写法2:窗口函数计算全局平均
SELECT id AS product_id, profit FROM ( SELECT id, profit, AVG(profit) OVER () AS avg_profit FROM products ) sub_query WHERE profit > avg_profit;
验证结果
根据你提供的数据,全表利润平均值约为4.51,上述查询会返回所有profit > 4.51的记录,比如id=1(6.00)、id=6(8.00)、id=20(16.00)等符合条件的条目。
内容的提问来源于stack exchange,提问作者visionary_20
相关产品推荐
相关产品推荐

