Как использовать исключения из календаря для создания точных расписаний с использованием GTFS?

У меня проблемы с вычислением запроса GTFS для получения следующих 20 расписаний для данного идентификатора остановки и заданного направления.

Я знаю идентификатор остановки, идентификатор направления поездки, время (сейчас) и дату (сегодня)

я написал

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 (то есть удаленными или добавленными исключениями), все работает отлично.

Так что я думаю, что неправильно пишу проверку исключений. Как написано выше с // комментариями, я хочу проверить, что

  • сегодня в обычном сервисе (от проверки таблицы календаря)
  • на сегодня нет исключений для удаления (или в этом случае поездки, соответствующие этому идентификатору услуги, не включаются в расчет)
  • если на сегодня добавлено исключение, соответствующие поездки должны быть включены в расчет

ты можешь мне помочь с этим?

1 ответ

Решение

Я вполне уверен, что невозможно сделать то, что вы пытаетесь сделать только с одним SELECT заявление, из-за дизайна calendar а также calendar_dates столы.

Я использую второй внутренний запрос для создания набора идентификаторов активных служб в запрошенную дату, а затем присоединяюсь к внешнему запросу для этого набора, чтобы включить только результаты, относящиеся к этой дате. Попробуй это:

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
Другие вопросы по тегам