0

我无法弄清楚 GTFS 查询以获取给定停止 ID 和给定方向的下 20 个时间表。

我知道停靠点 ID、行程方向 ID、时间(现在)和日期(今天)

我写

SELECT DISTINCT ST.departure_time FROM stop_times ST
JOIN trips T ON T._id = ST.trip_id
JOIN calendar C ON C._id = T.service_id
JOIN calendar_dates CD on CD.service_id = T.service_id
WHERE ST.stop_id =  3377699724118483 
AND T.direction_id = 0
AND ST.departure_time >= "16:00:00"
AND 
( 
( C.start_date <= 20140607 AND C.end_date >= 20140607 AND C.saturday= 1 ) // regular service today
AND (     ( CD.date != 20140607 ) // no exception today
OR  ( CD.date = 20140607 AND CD.exception_type = 1 ) // or ADDED exception today
)
)
ORDER BY stopTimes.departure_time LIMIT 20

这导致找不到记录。如果删除最后一部分,处理 CD 表(即删除或添加的异常),它工作得很好。

所以我认为我写错了对异常的检查。正如上面写的 // 注释,我想检查一下

  • 今天是常规服务(通过查看日历表)
  • 今天没有移除异常(或者在这种情况下,与此服务 ID 对应的行程不包括在计算中)
  • 如果今天增加了例外,则相应的行程应包含在计算中

你能帮我吗?

4

1 回答 1

4

SELECT我相当肯定,由于calendarandcalendar_dates表的设计,不可能只用一个语句来做你想做的事情。

我所做的是使用第二个内部查询在请求的日期构建一组活动服务 ID,然后加入针对该集合的外部查询以仅包含与该日期相关的结果。尝试这个:

SELECT DISTINCT ST.departure_time FROM stop_times ST
  JOIN trips T ON T._id = ST.trip_id
  JOIN (SELECT _id FROM calendar
          WHERE start_date <= 20140607
            AND end_date >= 20140607
            AND saturday = 1
          UNION
            SELECT service_id FROM calendar_dates
              WHERE date = 20140607
                AND exception_type = 1
          EXCEPT
            SELECT service_id FROM calendar_dates
              WHERE date = 20140607
                AND exception_type = 2
       ) ASI ON ASI._id = T.service_id
  WHERE ST.stop_id = 3377699724118483 
    AND T.direction_id = 0
    AND ST.departure_time >= "16:00:00"
  ORDER BY ST.departure_time
  LIMIT 20
于 2014-06-07T19:25:30.230 回答