我在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的两条记录,其中只有一条记录。
答案 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)