如何使用MAX聚合函数查询按NAME1分组下年龄最大的全量数据
假设你的表名为people,可以用以下两种常见方案实现需求:
方法1:窗口函数法(兼容MySQL 8.0+/PostgreSQL/SQL Server/Oracle等所有主流新版数据库)
这是目前最简洁高效的写法,用ROW_NUMBER()窗口函数按NAME1分组后按AGE倒序排序,取每组排序第一的记录即可:
SELECT NAME1, NAME2, AGE FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY NAME1 ORDER BY AGE DESC) AS rn FROM people ) t WHERE rn = 1;
注意:如果同个
NAME1下存在多条年龄相同的最大值记录,你想要全部取出的话,把ROW_NUMBER()换成RANK()即可。
方法2:子查询关联法(兼容MySQL 5.x等旧版数据库)
如果你的数据库不支持窗口函数,可以先分组查询每个NAME1的最大年龄,再关联原表取完整记录:
SELECT p.NAME1, p.NAME2, p.AGE FROM people p INNER JOIN ( SELECT NAME1, MAX(AGE) AS max_age FROM people GROUP BY NAME1 ) t ON p.NAME1 = t.NAME1 AND p.AGE = t.max_age;
这个写法如果同个
NAME1下有多个相同最大年龄的记录,会全部返回,符合需求可直接使用。
两种写法的运行结果均和你预期一致:
| NAME1 | NAME2 | AGE |
|---|---|---|
| Lars | Thomsen | 57 |
| Per | Olsen | 58 |
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

