【发布时间】:2020-10-08 14:12:57
【问题描述】:
我试图了解如何编写我的查询,以便对于某些列,它返回其他列具有最小值或最大值的值,同时返回这些列的最小值/最大值。
我有两个包含驱动器(开车旅行)和街道地址的 Postgresql 表,我想从中选择数据以将驱动器组合成旅行。例如,从我家到商店是一个驱动器,再回去是另一个驱动器,将两者组合在一起形成一个单程。对于每个这样的分组旅行,我想获取第一个驱动器的开始时间和地址,最终驱动器的结束时间和位置,以及所有驱动器时间和距离的总和。
这是获取我想组合成一次行程的三个驱动器的示例查询:
SELECT
start_time,
end_time,
duration,
distance,
start_address.name AS start_address,
end_address.name AS end_address
FROM drives
LEFT JOIN addresses start_address ON start_address_id = start_address.id
LEFT JOIN addresses end_address ON end_address_id = end_address.id
WHERE drives.id=ANY('{10, 11, 12}');
运行此查询可能会产生以下结果:
row# | start_time | end_time | duration | distance | start_address | end_address
----------------------------------------------------------------------------------
1 14:40:00 14:43:00 3 0.75 Home The store
2 14:48:00 14:58:00 10 2.25 The store Post office
3 15:10:00 15:08:00 8 2.00 Post office Work
现在,我想构建一个查询,该查询应该产生一行代表这三个驱动器的组合行程。我希望该行包含最小开始时间、最大结束时间、持续时间的总和、距离的总和、具有最小开始时间的行的起始地址和具有最长结束时间。
如果我省略地址部分,那很简单:
SELECT
min(start_time) AS start_time,
max(end_time) AS end_time,
sum(duration) AS duration,
sum(distance) AS distance
FROM drives
WHERE drives.id=ANY('{10, 11, 12}');
row# | start_time | end_time | duration | distance
----------------------------------------------------
1 14:40:00 15:08:00 21 5.00
但是我如何编写查询以便我也得到地址?我想要这个结果:
row# | start_time | end_time | duration | distance | start_address | end_address
----------------------------------------------------------------------------------
1 14:40:00 15:08:00 21 5.00 Home Work
显然我需要将地址部分返回到查询中,但无论我尝试什么,我都无法弄清楚如何正确构造它。坦率地说,我什至不确定我得到了这个问题的标题:/
【问题讨论】:
标签: sql postgresql