如何在HSQL中为每个分组选取列最大值对应的行?
解决方案:HSQL中为每个城市选取年龄最大的单条记录
针对你在HSQL数据库中PERSON表的需求——每个城市选年龄最大的记录,若同一城市有多个同最大年龄的记录则任选其一——这里有两种实用的实现方式:
方法1:使用ROW_NUMBER()窗口函数(推荐)
窗口函数是处理这类分组取TopN需求最简洁的方式,ROW_NUMBER()会为每个城市的记录按年龄降序分配唯一行号,我们只需要取行号为1的记录即可:
SELECT NAME, AGE, CITY FROM ( SELECT NAME, AGE, CITY, ROW_NUMBER() OVER (PARTITION BY CITY ORDER BY AGE DESC) AS rn FROM PERSON ) t WHERE rn = 1;
说明:
PARTITION BY CITY:按城市分组,每个城市单独计算行号ORDER BY AGE DESC:同一城市内按年龄从大到小排序,年龄最大的记录行号为1- 即使同一城市有多个年龄相同的最大记录,
ROW_NUMBER()也会给它们分配不同的行号,最终只会返回其中一条(具体返回哪条取决于数据库的默认排序,若需要指定规则可以在ORDER BY后再加其他字段,比如ORDER BY AGE DESC, NAME ASC)
方法2:使用关联子查询 + 分组
如果你的HSQL版本不支持窗口函数(较旧版本),可以用子查询先获取每个城市的最大年龄,再关联原表,最后通过分组确保每个城市只返回一条记录:
SELECT p.NAME, p.AGE, p.CITY FROM PERSON p JOIN ( SELECT CITY, MAX(AGE) AS max_age FROM PERSON GROUP BY CITY ) t ON p.CITY = t.CITY AND p.AGE = t.max_age GROUP BY p.CITY, p.AGE HAVING p.NAME = MIN(p.NAME); -- 这里用MIN(NAME)任选一条,也可以用MAX(NAME)
说明:
- 子查询先计算每个城市的最大年龄
- 关联原表筛选出所有城市中年龄等于该城市最大年龄的记录
- 最后通过
GROUP BY和HAVING子句,选取每个城市组内任意一条记录(这里用最小的NAME来确定,你也可以根据需求替换成其他字段的聚合函数)
内容的提问来源于stack exchange,提问作者user7641132
相关产品推荐
相关产品推荐

