如何从相似标签的SQL记录分组中获取金额的最小值与最大值
问题说明
你现有写法在开启严格GROUP BY校验的数据库(如MySQL 5.7+、PostgreSQL、Oracle)中会执行失败,原因是SELECT子句中出现了未参与聚合、也未加入GROUP BY的字段p2.label。
修正方案
方案1:兼容多数据库的关联查询写法
把查询用到的packages表非聚合字段全部加入GROUP BY即可:
SELECT p2.id, p2.label, MIN(p.amount) AS low_price, MAX(p.amount) AS high_price FROM prices p INNER JOIN packages p2 ON p.package_id = p2.id GROUP BY p2.id, p2.label
如果packages表的id是主键,可唯一对应label字段,支持函数依赖校验的数据库也可直接使用你原来的写法。
方案2:单表查询简化写法
如果你贴的示例数据全部存储在同一张表,不需要跨表关联,可直接简化写法:
SELECT id, label, MIN(amount) AS low_price, MAX(amount) AS high_price FROM 表名 GROUP BY id, label
执行结果
最终会返回你需要的2条分组结果:
- id为1的
Syndicate Integrated Webservices标签最低金额6.41,最高金额31.58 - id为2的
Architect Open-Source Partnerships标签最低金额6.24,最高金额41.84
内容的提问来源于stack exchange,提问作者Eric Evans
相关产品推荐
相关产品推荐

