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

寻求替代ORDER BY GROUP BY获取各ProductModelID价格极值的SQL方案

解决每个ProductModelID的最高/最低价格获取问题

嘿,我完全懂你的感受!网上相关讨论虽多,但SQL新手刚碰分组聚合的时候,确实容易踩“GROUP BY只取首次匹配”的坑。别担心,咱们一步步把这个问题搞定。

首先得明确核心需求:你需要按ProductModelID分组,然后拿到每组对应的最低和最高价格对吧?之前你遇到的“只取ID1、4这类首次记录”的问题,大概率是因为之前的SQL写法没正确使用聚合函数,而是直接把非聚合字段(比如ProductVariantID)放到SELECT里导致的。

基础方案:直接获取每组的最高/最低价格

如果只需要每个ProductModelID对应的价格极值,用最基础的聚合函数就能解决,写法如下:

SELECT 
    ProductModelID,
    MIN(Price) AS 最低价格,
    MAX(Price) AS 最高价格
FROM 
    你的表名 -- 记得替换成实际表名
GROUP BY 
    ProductModelID;

这个写法的逻辑很清晰:GROUP BY ProductModelID会把所有同模型ID的记录归为一组,MIN()和MAX()这两个聚合函数会遍历每组里的所有Price值,分别筛选出最小和最大的数值,完全不会只取首次匹配的记录。

进阶方案:获取对应价格的ProductVariantID

如果你还想知道哪个ProductVariantID对应了最低/最高价格,那就得用到窗口函数了,比如ROW_NUMBER():

-- 获取每个ProductModelID的最低价格对应的变体信息
WITH 价格排序表 AS (
    SELECT 
        ProductModelID,
        ProductVariantID,
        Price,
        -- 按模型ID分组,每组内按价格升序排序,给每条记录打序号
        ROW_NUMBER() OVER (PARTITION BY ProductModelID ORDER BY Price ASC) AS 价格排序号
    FROM 
        你的表名
)
SELECT 
    ProductModelID,
    ProductVariantID,
    Price AS 最低价格
FROM 
    价格排序表
WHERE 
    价格排序号 = 1;

如果要拿最高价格,只需要把ORDER BY Price ASC改成ORDER BY Price DESC就行。这里的PARTITION BY ProductModelID相当于给每个模型ID单独开一个分组排序,ROW_NUMBER()会给每组里价格最低的记录打上1号,最后筛选出序号为1的记录就能得到对应变体了。

小提醒

  • 确保你的Price字段是数值类型(比如INT、DECIMAL),如果是字符串类型的话,MIN()/MAX()会按字符串排序,结果可能不符合预期;
  • 替换代码里的你的表名为实际的表名称哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:39:29