PostgreSQL如何获取GROUP BY子句未包含的列:按配送方式取最高价配送详情
PostgreSQL查询每个配送方式最高价格完整明细解决方案
方法1:使用窗口函数(推荐)
PostgreSQL 支持窗口函数,可以直接对每个配送方式分组内的记录按价格降序排序后取首位,既可以拿到完整的shipping_details字段,也可以关联获取配送方式的其他信息:
WITH ranked_shipping AS ( SELECT sd.*, sm.name AS shipping_method_name, sm.abbrev AS shipping_method_abbrev, -- 按配送方式分组,组内按价格降序排序 ROW_NUMBER() OVER (PARTITION BY sd.shipping_method_id ORDER BY sd.price DESC) AS rn FROM shipping_details sd LEFT JOIN shipping_method sm ON sm.id = sd.shipping_method_id ) -- 取每个分组排序第一的记录,即为最高价明细 SELECT id, shipping_method_id, estimated_time_min, estimated_time_max, price, shipping_method_name, shipping_method_abbrev FROM ranked_shipping WHERE rn = 1;
如果同一个配送方式存在多条价格相同的最高记录,你需要全部返回时,把ROW_NUMBER()替换为RANK()即可。
方法2:使用关联子查询
如果不想使用CTE和窗口函数,也可以用子查询先查出每个配送方式的最高价格,再关联回原表匹配完整记录:
SELECT sd.*, sm.name AS shipping_method_name, sm.abbrev AS shipping_method_abbrev FROM shipping_details sd LEFT JOIN shipping_method sm ON sm.id = sd.shipping_method_id WHERE (sd.shipping_method_id, sd.price) IN ( SELECT shipping_method_id, MAX(price) FROM shipping_details GROUP BY shipping_method_id );
内容的提问来源于stack exchange,提问作者Lemayzeur
相关产品推荐
相关产品推荐

