查询关联的 MAX 列及其在 Postgres 中的所有字段
Query associated MAX column with all it's fields in Postgres
我有三个数据库表:
- 汽车
- id
- 速度
- id
- actual_speed
- car_id
- gear_id
- 齿轮
- id
我想 select 所有汽车的最高速度以及它们达到最高速度时使用的档位。我得到以下查询:
SELECT MAX(speed.actual_speed)
FROM car
INNER JOIN speed ON car.id = speed.car_id
GROUP BY car.id;
此查询有效,但 return 无效。如果我在 select SELECT MAX(speed.actual_speed), speed.gear_id
中包含 gear_id
。数据库抱怨 gear_id
应该包含在 group by 或聚合函数中。
但是,如果我通过 GROUP BY car.id, speed.gear_id
将其包含在组中,查询 returns 我不感兴趣的所有齿轮的最大速度。
有没有办法让所有汽车恢复到最高速度和达到最高速度的档位?
一个简单且可移植的解决方案使用相关子查询:
select s.*
from speed s
where s.actual_speed = (select max(s1.actual_speed) from speed s1 where s1.car_id = s.car_id)
这将有利于 (car_id, actual_speed)
上的索引。
在 Postgres 中,我会推荐 distinct on
:
select distinct on (car_id) s.*
from speed s
order by car_id, actual_speed desc
或者,如果您想允许平局:
select *
from (
select s.*, rank() over(partition by car_id order by actual_speed desc) rn
from speed s
) s
where rn = 1
我有三个数据库表:
- 汽车
- id
- 速度
- id
- actual_speed
- car_id
- gear_id
- 齿轮
- id
我想 select 所有汽车的最高速度以及它们达到最高速度时使用的档位。我得到以下查询:
SELECT MAX(speed.actual_speed)
FROM car
INNER JOIN speed ON car.id = speed.car_id
GROUP BY car.id;
此查询有效,但 return 无效。如果我在 select SELECT MAX(speed.actual_speed), speed.gear_id
中包含 gear_id
。数据库抱怨 gear_id
应该包含在 group by 或聚合函数中。
但是,如果我通过 GROUP BY car.id, speed.gear_id
将其包含在组中,查询 returns 我不感兴趣的所有齿轮的最大速度。
有没有办法让所有汽车恢复到最高速度和达到最高速度的档位?
一个简单且可移植的解决方案使用相关子查询:
select s.*
from speed s
where s.actual_speed = (select max(s1.actual_speed) from speed s1 where s1.car_id = s.car_id)
这将有利于 (car_id, actual_speed)
上的索引。
在 Postgres 中,我会推荐 distinct on
:
select distinct on (car_id) s.*
from speed s
order by car_id, actual_speed desc
或者,如果您想允许平局:
select *
from (
select s.*, rank() over(partition by car_id order by actual_speed desc) rn
from speed s
) s
where rn = 1