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

SQL使用GROUP BY按size分组时如何获取对应最低价格的sku?

你之前的写法不符合SQL规范:GROUP BY分组后,SELECT查询的字段只能是分组字段、或者经过聚合函数计算的字段,直接查询sku这类非分组非聚合字段时,数据库无法确定要返回分组内的哪条记录,因此开启only_full_group_by配置后会报错或返回不符合预期的结果。

下面是两种符合要求的实现方案:

方案1:MySQL 8.0及以上版本(推荐使用窗口函数)

用ROW_NUMBER()窗口函数给每个尺寸分组内的记录按价格升序排序,取排序第一的记录就是对应最低价格的整条sku信息:

WITH ranked_sku AS (
    SELECT 
        barcode, size, thecarpet_price as price,
        ROW_NUMBER() OVER (PARTITION BY size ORDER BY thecarpet_price ASC) as rn
    FROM `sku_list` 
    WHERE `design` = 80190 
      AND thecarpet_price IS NOT NULL 
      AND status = 1 
      AND thecarpet = 1 
)
SELECT barcode, size, price 
FROM ranked_sku 
WHERE rn = 1
ORDER BY size ASC;

如果同尺寸存在多个相同最低价格的sku,想要全部返回的话,把ROW_NUMBER()换成RANK()即可。

方案2:MySQL 5.x版本(子查询关联法)

先查询出每个尺寸对应的最低价格,再关联原表匹配对应记录:

SELECT s.barcode, s.size, s.thecarpet_price as price
FROM `sku_list` s
INNER JOIN (
    SELECT size, MIN(thecarpet_price) as min_price
    FROM `sku_list`
    WHERE `design` = 80190 
      AND thecarpet_price IS NOT NULL 
      AND status = 1 
      AND thecarpet = 1 
    GROUP BY size
) t ON s.size = t.size AND s.thecarpet_price = t.min_price
WHERE s.`design` = 80190 
  AND s.thecarpet_price IS NOT NULL 
  AND s.status = 1 
  AND s.thecarpet = 1 
ORDER BY s.size ASC;

如果同尺寸有多个相同最低价的sku不需要全部返回,只需任意一条的话,可以在语句末尾加上GROUP BY s.size。

内容的提问来源于stack exchange,提问作者Alper Uluses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:06:03