Postgres计算字段与全局最大值比例出现GROUP BY报错如何解决
报错原因
你使用max()聚合函数时未指定GROUP BY子句,数据库会默认把整张表聚合为单行结果,但你同时查询了name、weight、height这类非聚合的行级字段,不符合SQL聚合查询的语法规则,所以触发报错。
修复方案
方案1:使用窗口函数(推荐)
PostgreSQL支持窗口函数,在max()后加OVER()即可计算全局最大值,且会为每一行都返回该聚合结果,不会合并多行数据:
SELECT name, weight, height, weight::numeric / MAX(weight) OVER () AS weight_ratio, height::numeric / MAX(height) OVER () AS height_ratio FROM people;
注意点:
- 代码中
::numeric是强制类型转换,避免int4类型的整数除法导致结果为0的问题,比如50/100用int4计算会得到0,转成数值类型后才能得到0.5的正确比值 OVER()子句未指定分区条件时,会统计整张表的最大值,也就是你需要的全局最大值
方案2:使用子查询关联计算
你也可以先通过子查询查询到全局的最大weight和最大height,再和原表关联计算比值:
SELECT p.name, p.weight, p.height, p.weight::numeric / g.max_weight AS weight_ratio, p.height::numeric / g.max_height AS height_ratio FROM people p CROSS JOIN ( SELECT MAX(weight) AS max_weight, MAX(height) AS max_height FROM people ) g
内容的提问来源于stack exchange,提问作者alekscooper
相关产品推荐
相关产品推荐

