SQL如何基于分组列筛选另一列最大值对应的关联行记录?
SQL分组取组内最大值对应行的可行方案
你需要实现的是按Name字段分组,提取每组中Contracts字段值最高的对应完整记录,以下是两种不同场景下的可直接复用方案:
方案1:窗口函数写法(适配MySQL8.0+、PostgreSQL、Oracle、SQL Server等所有支持窗口函数的新版数据库)
这是目前最推荐的实现方式,逻辑清晰且执行效率高:
WITH ranked_records AS ( SELECT Name, Account, Contracts, -- 按Name分组后对Contracts倒序排序,每组的第一条就是最大值对应记录 ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Contracts DESC) AS group_rank FROM 替换为你的实际表名 ) SELECT Name, Account, Contracts FROM ranked_records WHERE group_rank = 1;
如果同一个Name下存在多条Contracts值相同的最高记录,需要全部返回时,把ROW_NUMBER()替换为RANK()即可。
方案2:子查询关联写法(适配MySQL5.x等不支持窗口函数的老旧版本数据库)
SELECT t1.Name, t1.Account, t1.Contracts FROM 替换为你的实际表名 t1 INNER JOIN ( -- 先查询每个Name对应的最大Contracts值 SELECT Name, MAX(Contracts) AS max_contract FROM 替换为你的实际表名 GROUP BY Name ) t2 ON t1.Name = t2.Name AND t1.Contracts = t2.max_contract;
失效原因说明
GREATEST()函数的作用是返回同一行中多个输入参数的最大值,无法实现分组后不同行之间的最大值筛选,不符合你的使用场景DISTINCT的作用是对查询返回的整行结果去重,没有分组筛选最大值的能力,因此也无法满足需求
内容的提问来源于stack exchange,提问作者Dylanthemachine
相关产品推荐
相关产品推荐

