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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:07:28