SQL查询:按B分组获取每组C最大值对应的全量数据
解决方案
针对按b分组,返回每组中c值最大的完整行(包含a、b、c、d、e、f列),可以用以下几种实用方法:
方法1:窗口函数(推荐,简洁高效)
利用ROW_NUMBER()窗口函数实现分组排序,直接筛选每组中c值最大的行:
SELECT a, b, c, d, e, f FROM ( SELECT a, b, c, d, e, f, ROW_NUMBER() OVER (PARTITION BY b ORDER BY c DESC) AS rn FROM mytable WHERE b IN (list of values) ) t WHERE rn = 1;
- 逻辑说明:
PARTITION BY b按b分组,ORDER BY c DESC让每组内c值最大的行排在首位,rn=1精准筛选出该行。 - 适用场景:支持MySQL 8+、PostgreSQL、Oracle、SQL Server等大部分现代数据库,性能优异。
方法2:关联子查询(兼容旧版数据库)
如果你的数据库不支持窗口函数(如MySQL 5.x),可以先通过子查询获取每组的最大c值,再关联原表拿到完整行:
SELECT t1.a, t1.b, t1.c, t1.d, t1.e, t1.f FROM mytable t1 JOIN ( SELECT b, MAX(c) AS max_c FROM mytable WHERE b IN (list of values) GROUP BY b ) t2 ON t1.b = t2.b AND t1.c = t2.max_c WHERE t1.b IN (list of values);
- 逻辑说明:子查询先得到每个
b对应的最大c值,再通过b和c的关联匹配到原表中的完整数据。 - 注意:若同一
b组内存在多行c值等于最大值,该方法会返回所有符合条件的行;如需仅返回一行,可结合主键a额外筛选。
关于你遇到的报错原因
你尝试的select b, max(c), a, d, e, f from table where b in (range) group by b报错'not a GROUP BY expression',核心原因是SQL的语法规则:SELECT子句中的非聚合列必须出现在GROUP BY子句中。你仅将b加入GROUP BY,但a、d、e、f既不是聚合函数结果,也未在GROUP BY中声明,数据库无法确定要返回这些列的哪一个值(同一b组内可能存在多个不同取值)。
内容的提问来源于stack exchange,提问作者Bob Jones
相关产品推荐
相关产品推荐

