跨越多个行程选项(GTFS)的两个停靠点之间的最短时间和行程

时间:2014-11-26 03:37:45

标签: sql sqldf

我正在使用GTFS关系数据库来查找两个给定点之间提供的最快旅行时间。我拥有的字段是trip_idarrival_timedeparture_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。)

1 个答案:

答案 0 :(得分:1)

我认为这应该可以使用maxcaselimit一起使用:

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}}。