计算even表订单价格中位数时SQL报错求助
解决PostgreSQL计算订单价格中位数的错误
错误原因分析
你遇到的No operator matches the given name and argument types错误,核心是类型不匹配:
rn是row_number()生成的整数类型,但你将MAX(rn)转为decimal后用//整除,得到decimal类型值,整数与decimal直接比较触发类型不匹配。- 另外,SQL末尾的
FROM even会让结果重复输出even表的所有行数,属于冗余写法。
修正后的自定义查询
调整类型匹配问题,同时优化查询结构:
SELECT CASE WHEN max_rn % 2 = 0 THEN ( (SELECT price FROM even WHERE rn = max_rn / 2) + (SELECT price FROM even WHERE rn = max_rn / 2 + 1) ) / 2.0 ELSE (SELECT price FROM even WHERE rn = max_rn / 2 + 1) END AS median_price FROM (SELECT MAX(rn) AS max_rn FROM even) AS t;
说明:
- 用子查询提前获取
max_rn,避免重复计算,全程保持整数运算,规避类型转换导致的不匹配。 - 用
/ 2.0确保结果为小数类型,避免整数除法丢失精度。
更简洁的PostgreSQL内置函数方案
PostgreSQL提供了专门的中位数计算函数,无需手动实现row_number逻辑,高效且不易出错:
连续中位数(PERCENTILE_CONT)
返回插值后的中位数,适合数值型数据:
SELECT PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price) AS median_price FROM even;
离散中位数(PERCENTILE_DISC)
返回数据集中实际存在的中位数:
SELECT PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY price) AS median_price FROM even;
内容的提问来源于stack exchange,提问作者АЛлександр Рудинский
相关产品推荐
相关产品推荐

