如何使用GROUP BY并获取对应行结果?求最大col2对应的col3、col4
Hey Idan, great questions—these are super common scenarios when working with SQL, so let's walk through solutions for both cases clearly.
一、获取col2最大值对应的col3和col4
如果要拿到col2取值最大的单行(或多行)对应的其他列,有几种靠谱的方法,适配不同数据库:
方法1:子查询匹配最大值
这是最直观的方式,先查出col2的最大值,再用这个值过滤原表:
SELECT col2, col3, col4 FROM your_table WHERE col2 = (SELECT MAX(col2) FROM your_table);
注意:如果有多行的col2都是最大值,这个查询会返回所有符合条件的行。如果只需要其中一行,可以在末尾加
LIMIT 1(适用于MySQL、PostgreSQL等支持LIMIT的数据库)。
方法2:窗口函数(推荐,适配现代数据库)
用ROW_NUMBER()或RANK()窗口函数给行排序,直接取排名第一的行:
SELECT col2, col3, col4 FROM ( SELECT *, -- 按col2降序排,给每行编号 ROW_NUMBER() OVER (ORDER BY col2 DESC) AS row_rank FROM your_table ) ranked_data WHERE row_rank = 1;
- 如果想保留所有
col2为最大值的行,把ROW_NUMBER()换成RANK()即可(RANK()会给相同最大值的行相同排名)。 - 这个方法支持MySQL 8+、PostgreSQL、SQL Server、Oracle等几乎所有现代数据库。
方法3:LIMIT+ORDER BY(简单快捷)
如果你的数据库支持LIMIT,可以直接排序后取第一行:
SELECT col2, col3, col4 FROM your_table ORDER BY col2 DESC LIMIT 1;
局限性:如果有多个最大值,只会返回排序后的第一行,无法拿到所有最大值行。
二、GROUP BY后获取其他列的结果
GROUP BY的核心是聚合分组内的数据,直接SELECT未聚合的非分组列在严格模式下会报错(比如MySQL开启ONLY_FULL_GROUP_BY)。正确的做法是结合窗口函数或JOIN来关联分组后的最大值与原表数据。
举个例子:假设你要按col1分组,获取每个组内col2最大的那一行的col3和col4:
方法1:窗口函数+过滤(推荐)
用PARTITION BY按col1分组,组内按col2降序排序,再取每组的第一行:
SELECT col1, col2, col3, col4 FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2 DESC) AS row_rank FROM your_table ) ranked_groups WHERE row_rank = 1;
- 同样,用
RANK()替代ROW_NUMBER()可以保留每组内所有col2为最大值的行。
方法2:聚合子查询+JOIN
先通过GROUP BY得到每个分组的col2最大值,再和原表JOIN匹配对应的行:
SELECT t.col1, t.col2, t.col3, t.col4 FROM your_table t INNER JOIN ( -- 先分组得到每个col1对应的最大col2 SELECT col1, MAX(col2) AS max_col2 FROM your_table GROUP BY col1 ) group_max ON t.col1 = group_max.col1 AND t.col2 = group_max.max_col2;
这个方法也会返回每组内所有
col2等于最大值的行,适合需要保留所有匹配行的场景。
内容的提问来源于stack exchange,提问作者ida dolev

