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

时间:2018-05-08 08:57:35

标签: sql greatest-n-per-group hsqldb

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

const obj = {1:false, 2:true, 3:true};

const res = Object.keys(obj).filter(k => obj[k]);

console.log(res); 

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

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

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

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

仅使用city列上的group by和max(age)作为聚合函数不起作用,因为这不允许我选择除年龄和城市之外的其他列,因为它们不在聚合中。我试着通过组合然后将结果加回到表中,但是这样我就无法摆脱具有重复最大年龄的记录。这个查询:

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

产量:

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

对于nyc的两条记录,其中只有一条记录。

2 个答案:

答案 0 :(得分:1)

如果您不关心订单,那么您可以使用相关 subquery

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);

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

答案 1 :(得分:0)

相关子查询解决方案的现代SQL替代方法是LATERAL关键字:

SELECT * FROM 
 (SELECT DISTINCT CITY FROM PERSON) CITIES, 
 LATERAL 
 (SELECT * FROM PERSON WHERE CITY = CITIES.CITY ORDER BY AGE DESC LIMIT 1)