0

特定の停留所 ID と特定の方向の次の 20 件のスケジュールを取得するための GTFS クエリがわかりません。

停留所 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の設計上、単一のステートメントだけでやろうとしていることを実行することは不可能であると確信しています。calendarcalendar_dates

私がしていることは、2 番目の内部クエリを使用して、要求された日付にアクティブなサービス 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 に答える