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

如何按Key分组获取每组最大Sales值?SQL分组查询问题求解

解决方案:按分组获取最大值对应完整记录

问题背景

你的数据表结构及数据如下:

Sales Key Cod  Value
10    A   109  10.99  
7     A   10   11.05
3     B   1    10.30
25    B   125  15.30

需求是按Key分组,取出每组中Sales值最大的完整记录,最终结果应为:

Sales Key Cod  Value
10    A   109  10.99  
25    B   125  15.30

你之前尝试的SQL因cod、value既不在GROUP BY中也不是聚合函数报错,加入cod到GROUP BY又会返回多条记录,下面提供几种替代方案:


方案1:子查询关联(通用跨数据库)

先通过子查询拿到每个Key对应的最大Sales值,再关联原表筛选匹配记录:

SELECT t.*
FROM your_table t
INNER JOIN (
    SELECT `Key`, MAX(Sales) AS max_sales
    FROM your_table
    GROUP BY `Key`
) t_max ON t.`Key` = t_max.`Key` AND t.Sales = t_max.max_sales;

优势:几乎兼容所有关系型数据库,只要给Key和Sales建立合适的联合索引,执行效率会很高。如果同一Key组存在多条Sales等于最大值的记录,会全部返回。


方案2:WHERE子句加相关子查询

直接在WHERE中判断当前记录的Sales是否是对应Key组的最大值:

SELECT *
FROM your_table t
WHERE t.Sales = (
    SELECT MAX(Sales)
    FROM your_table
    WHERE `Key` = t.`Key`
);

优势:写法简洁,逻辑直观,同样支持返回所有最大值匹配的记录。


方案3:数据库特定优化语法

MySQL/MariaDB专属

利用GROUP_CONCAT配合字符串截取获取对应字段值(注意:字段值不能包含逗号,且仅返回第一条最大值记录):

SELECT 
    MAX(Sales) AS Sales,
    `Key`,
    SUBSTRING_INDEX(GROUP_CONCAT(Cod ORDER BY Sales DESC), ',', 1) AS Cod,
    SUBSTRING_INDEX(GROUP_CONCAT(Value ORDER BY Sales DESC), ',', 1) AS Value
FROM your_table
GROUP BY `Key`;

PostgreSQL专属

使用DISTINCT ON语法,语法简洁且数据库有专门优化:

SELECT DISTINCT ON (`Key`) *
FROM your_table
ORDER BY `Key`, Sales DESC;

这个写法会返回每个Key组中Sales最大的第一条记录,效率很高。


关于窗口函数的补充

你提到担心窗口函数效率,但现代数据库(MySQL8.0+、PostgreSQL、SQL Server等)对窗口函数的优化已经很成熟,在有合适索引的情况下,效率并不比上述方案差,甚至某些场景更优。如果可以接受,窗口函数的写法也很清晰:

SELECT Sales, `Key`, Cod, Value
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY `Key` ORDER BY Sales DESC) AS rn
    FROM your_table
) t
WHERE rn = 1;

如果要保留所有Sales等于最大值的记录,把ROW_NUMBER()换成RANK()即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:15:45