SQL查询求助:获取每个productId对应的最小googlePrice完整记录
解决获取每个productId对应最小googlePrice完整记录的问题
你用group by t.productId的写法存在问题:priceRaw、id、title这些列既不在group by子句中,也没有用聚合函数包裹,数据库无法确定要返回这些列的哪一行值,因此结果不符合预期。
下面提供两种通用的解决方案:
方案一:使用窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY googlePrice ASC) AS rn FROM prices ) t WHERE t.rn = 1;
- 逻辑说明:
PARTITION BY productId按产品ID分组,ORDER BY googlePrice ASC让每组内按价格升序排序,ROW_NUMBER()给每组的行依次编号,取rn=1的行就是每组最小googlePrice的记录。 - 扩展:如果同一
productId存在多条相同最小googlePrice的记录,想要保留所有符合的行,可将ROW_NUMBER()替换为RANK()或DENSE_RANK()。
方案二:子查询关联(兼容大部分旧版本数据库)
SELECT p.* FROM prices p INNER JOIN ( SELECT productId, MIN(googlePrice) AS min_googlePrice FROM prices GROUP BY productId ) mp ON p.productId = mp.productId AND p.googlePrice = mp.min_googlePrice;
- 逻辑说明:先通过子查询获取每个
productId对应的最小googlePrice,再关联原表匹配产品ID和对应价格,从而得到完整的记录行。此方法会返回同一productId下所有符合最小价格的记录。
另外你最初的排序查询仅做了排序操作,没有过滤逻辑,因此无法直接得到每组最小价格的目标记录。
内容的提问来源于stack exchange,提问作者Eltar
相关产品推荐
相关产品推荐

