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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:22:33