You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算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,提问作者АЛлександр Рудинский

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:00:58