sql - 如何在HSQL中为每个组选择列中具有最大值的行?

标签 sql greatest-n-per-group hsqldb

我在 HSQL 数据库中有一个名为 PERSON 的表,如下所示:

NAME(PK) | AGE | CITY   | ... many more here ... | 
--------------------------------------------------
aaa      |  12 |   nyc  | ...
bbb      |  12 |   nyc  | ...
ccc      |  10 |   nyc  | ...
ddd      |  34 |    la  | ...
eee      |  10 |    la  | ...

对于每个城市,我需要选择年龄最大的记录。如果对于给定城市有多个记录具有相同的最大年龄,我仍然需要为该城市准确选择一个记录(但可以任意选择)。

所以在上面的例子中我需要这个结果:

NAME(PK) | AGE | CITY | ... many more here ... | 
--------------------------------------------------
aaa      |  12 |  nyc | ...
ddd      |  34 |   la | ...

如果我得到 bbb 而不是 aaa 就可以了,但得到 aaa 和 bbb 就不行了。

简单地在城市列上使用 group by 和 max(age) 作为聚合函数是行不通的,因为这不允许我选择除年龄和城市之外的其他列,因为它们不在聚合中。我尝试进行分组,然后将结果连接回表中,但这样我无法删除具有重复最大年龄的记录。此查询:

SELECT NAME, CITY, AGE, [... many more here ...] 
FROM ( 
    SELECT max(age) AS maxAge, city 
    FROM PERSON
    GROUP BY CITY
) AS x
JOIN PERSON AS p 
ON p.city = x.city AND p.age = x.maxAge

产量:

NAME(PK) | AGE | CITY | ... many more here ... | 
--------------------------------------------------
aaa      |  12 |  nyc | ...
bbb      |  12 |  nyc | ...
ddd      |  34 |   la | ...

纽约有两条记录,而应该只有一条。

最佳答案

如果您不关心顺序,那么您可以使用相关 子查询:

select * 
from PERSON p
where name = (select name 
              from PERSON 
              where CITY = p.City 
              order by AGE desc, name asc -- neglate name if you want arbitrary ordering 
              LIMIT 1);

这将为每个城市仅选择一个名称。

关于sql - 如何在HSQL中为每个组选择列中具有最大值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50229765/

相关文章:

php - Mysql获取日期为本月的元组

java - H2 数据库中的长字符串数据类型

sql - 对同一张表的不同条件的多个相关子查询

mysql - 从表中的组中挑选出最高的十个值或最高的 10% 的查询

sql - 如何在查询多个表的多列时从单个表的单列使用MAX

java - 使用 HSQLDB 作为 Spring、Hibernate 的可移植数据库

java - 如何忽略单元测试中的某些字段,Hibernate

sql - 创建具有数字范围的临时表

java - 来自java应用程序的hsqldb

MySQL 将表名传递给游标选择