我正在使用GTFS关系数据库来查找两个给定点之间提供的最快旅行时间。我拥有的字段是trip_id
,arrival_time
和departure_time
(从午夜开始的几分钟内)和stop_id
一部分数据可能是:
trip_id | arrival_time | departure_time | stop_id
1 | 5 | 5 | 90001
1 | 8 | 8 | 90002
1 | 10 | 10 | 90003
1 | 15 | 15 | 90004
2 | 25 | 25 | 90001
2 | 28 | 28 | 90002
2 | 32 | 33 | 90003
2 | 38 | 38 | 90004
3 | 35 | 35 | 90001
3 | 38 | 38 | 90002
3 | 48 | 48 | 90004
4 | 8 | 8 | 90003
4 | 10 | 10 | 90004
4 | 15 | 15 | 90005
我正在寻找从90001站出发到90003站的最短时间(以及相关的行程)。答案是5分钟的旅行' 1'这比旅行2的8分钟和旅行3不会停在90003这一事实。此外,时间差必须在同一行程中,输出距离旅行组合3分钟1和4。
如何编写SQL语句来执行此操作?到目前为止,我悲惨地失败了:
SELECT trip_id, arrival_time, departure_time, stop_id, MIN(departure_time-arrival_time)
FROM stop_times
WHERE stop_id IN (90001, 90003)
GROUP BY trip_id
(我已经对数据进行了分组,因此所有行程都按照我想要的方向进行,所以我不必动态地转动到达和离开。它始终是第一个departure_time
之间的时间。 stop_id
和第二个arrival_time
。)
答案 0 :(得分:1)
我认为这应该可以使用max
和case
与limit
一起使用:
select trip_id,
max(case when stop_id = 90003 then arrival_time end)
- max(case when stop_id = 90001 then departure_time end)
from stop_times
where stop_id in (90001,90003)
group by trip_id
order by 1
limit 1
我会注意到trip_id 2
,这将返回7而不是8(32-25)。但也许它应该对departure_time
两个case
语句使用{{1}}。