GTFS получает последнюю остановку в пути

Используя стандартную базу данных GTFS, я пытаюсь добавить название последней остановки в пути к моему текущему запросу, который возвращает следующее:

| trip_id                         | service_id | departure_stop | departure_time | arrival_stop    | arrival_time | end_departure |
|---------------------------------|------------|----------------|----------------|-----------------|--------------|---------------|
| 15693832.T6.2-EPP-E-mjp-1.11.R  | T6_1       | Clifton Hill   | 04:56:00       | Flinders Street | 05:07:00     | 05:07:00      |

и так далее.

Мой текущий запрос:

select `t`.`trip_id`,
       `c`.`service_id`,
       `start_s`.`stop_name` as `departure_stop`,
       `start_st`.`departure_time`,
       `end_s`.`stop_name` as `arrival_stop`,
       `end_st`.`arrival_time`,
       `end_st`.`departure_time` as `end_departure`
from `trips` as `t`
    inner join `calendar` as `c` on `t`.`service_id` = `c`.`service_id`
    inner join `routes` as `r` on `t`.`route_id` = `r`.`route_id` 
    inner join `stop_times` as `start_st` on `t`.`trip_id` = `start_st`.`trip_id` 
    inner join `stops` as `start_s` on `start_st`.`stop_id` = `start_s`.`stop_id` 
    inner join `stop_times` as `end_st` on `t`.`trip_id` = `end_st`.`trip_id` 
    inner join `stops` as `end_s` on `end_st`.`stop_id` = `end_s`.`stop_id` 
where `start_st`.`departure_time` > '00:00:00' 
    and `start_st`.`departure_time` < '23:59:59' 
    and `start_s`.`stop_id` = 19974 
    and `end_s`.`stop_id` = 19854 
    and start_st.departure_time < end_st.arrival_time
order by arrival_time asc

Я застрял, пытаясь понять, как я могу получить последнюю остановку в таблице stop_times для trip_id, которые мой запрос возвращает для каждой строки.

Итак, в дополнение к тому, что у меня есть на данный момент, я хотел бы:

  • получить последние stop_id для этого trip_id в таблице stop_times
  • получить stop_name из таблицы stops для соответствующего stop_id
  • отображать его как последний столбец в моем выводе как last_stop

Обновление:

Я попытался выбрать s.stop_name и добавить следующее внутреннее соединение:

inner join (
    SELECT s.stop_name, trip_id
        FROM stop_times 
        INNER JOIN stops as s on `s`.`stop_id` = `stop_times`.`stop_id`
        ORDER BY stop_sequence DESC
) s on `t`.`trip_id` = `s`.`trip_id`

Однако это добавляет дополнительные строки для каждой остановки в поездке, где мне нужна только последняя, ​​а добавление LIMIT 1 не дает результатов.


person r_t    schedule 01.09.2015    source источник
comment
попробуйте добавить end_s.stop_id = max(end_st.stop_sequence)   -  person Tony Laidig    schedule 01.09.2015
comment
где конкретно я бы это добавил?   -  person r_t    schedule 01.09.2015
comment
в предложении where. Это гарантирует, что конечное значение stop_id является максимальным (например, конечной остановкой).   -  person Tony Laidig    schedule 01.09.2015
comment
Ой. Но end_s - это остановка назначения, выбранная пользователем, я хочу, чтобы она также показывала последнюю возможную остановку во всем пробеге/поездке.   -  person r_t    schedule 01.09.2015
comment
Затем добавьте третье соединение. Это также может работать в соединении, которое вы упомянули в своем обновлении.   -  person Tony Laidig    schedule 02.09.2015


Ответы (1)


Одно предупреждение: время прибытия и отправления может быть позже полуночи в спецификации GTFS (значение часа может быть 24, 25 и т. д.).

select "t"."trip_id",
       "c"."service_id",
       "start_s"."stop_name" as "departure_stop",
       "start_st"."departure_time",
       "end_s"."stop_name" as "arrival_stop",
       "end_st"."arrival_time",
       "end_st"."departure_time" as "end_departure",
       "last_st"."arrival_time" as "last_arrival",
       "last_s"."stop_name" as "last_stop"
from "trips" as "t"
    inner join "calendar" as "c" on "t"."service_id" = "c"."service_id"
    inner join "routes" as "r" on "t"."route_id" = "r"."route_id" 
    inner join "stop_times" as "start_st" on "t"."trip_id" = "start_st"."trip_id" 
    inner join "stops" as "start_s" on "start_st"."stop_id" = "start_s"."stop_id" 
    inner join "stop_times" as "end_st" on "t"."trip_id" = "end_st"."trip_id" 
    inner join "stops" as "end_s" on "end_st"."stop_id" = "end_s"."stop_id" 
    inner join "stop_times" as "last_st" on "t"."trip_id" = "last_st"."trip_id" 
    inner join "stops" as "last_s" on "last_st"."stop_id" = "last_s"."stop_id" 
where "start_s"."stop_id" = '245' -- my data's stop id
    and "end_s"."stop_id" = '762' -- my data's stop id
    and "last_st"."stop_sequence" = (select max("stop_sequence") from "stop_times" where "t"."trip_id" = "trip_id")
    and start_st.departure_time < end_st.arrival_time
order by arrival_time asc
person user2638401    schedule 26.09.2015