如何在 HSQL 中为每个组的列中的最大值 select 行?
How to select row with maximum value in column for each group in HSQL?
我在 HSQL 数据库中有一个名为 PERSON 的 table,如下所示:
NAME(PK) | AGE | CITY | ... many more here ... |
--------------------------------------------------
aaa | 12 | nyc | ...
bbb | 12 | nyc | ...
ccc | 10 | nyc | ...
ddd | 34 | la | ...
eee | 10 | la | ...
对于每个城市,我需要 select 最大年龄的记录。如果对于一个给定的城市,有多个记录与最大年龄相关联,我仍然需要 select 这个城市的一个记录(但可以任意选择)。
所以在上面的例子中我需要这样的结果:
NAME(PK) | AGE | CITY | ... many more here ... |
--------------------------------------------------
aaa | 12 | nyc | ...
ddd | 34 | la | ...
如果我得到 bbb 而不是 aaa 就可以了,但是得到 aaa 和 bbb 就不行了。
简单地在 city 列上使用 group by 和 max(age) 作为聚合函数是行不通的,因为这不允许我 select 除 age 和 city 之外的其他列,因为它们不在聚合中.我尝试按分组方式进行分组,然后将结果加入 table,但这样我无法摆脱具有重复最大年龄的记录。此查询:
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 | ...
纽约有两条记录,而应该只有一条。
如果您不关心顺序,那么您可以使用 correlated 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);
这将select每个城市只有一个名称。
关联子查询解决方案的现代 SQL 替代方案是 LATERAL 关键字:
SELECT * FROM
(SELECT DISTINCT CITY FROM PERSON) CITIES,
LATERAL
(SELECT * FROM PERSON WHERE CITY = CITIES.CITY ORDER BY AGE DESC LIMIT 1)
我在 HSQL 数据库中有一个名为 PERSON 的 table,如下所示:
NAME(PK) | AGE | CITY | ... many more here ... |
--------------------------------------------------
aaa | 12 | nyc | ...
bbb | 12 | nyc | ...
ccc | 10 | nyc | ...
ddd | 34 | la | ...
eee | 10 | la | ...
对于每个城市,我需要 select 最大年龄的记录。如果对于一个给定的城市,有多个记录与最大年龄相关联,我仍然需要 select 这个城市的一个记录(但可以任意选择)。
所以在上面的例子中我需要这样的结果:
NAME(PK) | AGE | CITY | ... many more here ... |
--------------------------------------------------
aaa | 12 | nyc | ...
ddd | 34 | la | ...
如果我得到 bbb 而不是 aaa 就可以了,但是得到 aaa 和 bbb 就不行了。
简单地在 city 列上使用 group by 和 max(age) 作为聚合函数是行不通的,因为这不允许我 select 除 age 和 city 之外的其他列,因为它们不在聚合中.我尝试按分组方式进行分组,然后将结果加入 table,但这样我无法摆脱具有重复最大年龄的记录。此查询:
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 | ...
纽约有两条记录,而应该只有一条。
如果您不关心顺序,那么您可以使用 correlated 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);
这将select每个城市只有一个名称。
关联子查询解决方案的现代 SQL 替代方案是 LATERAL 关键字:
SELECT * FROM
(SELECT DISTINCT CITY FROM PERSON) CITIES,
LATERAL
(SELECT * FROM PERSON WHERE CITY = CITIES.CITY ORDER BY AGE DESC LIMIT 1)