Определить тип остановки с помощью канала GTFS - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть подача GTFS, и я пытаюсь определить тип остановки (bus, tram или multiple в моем случае) с использованием SQL. Для этого мне нужно получить все маршруты на каждой остановке и сравнить поле route.route_type, в котором содержится информация о типе маршрута (0 - трамвай, 3 - автобус).

Вот мой запрос:

SELECT stop.stop_id, route.route_type from stop
INNER JOIN stop_time on stop_time.stop_id = stop.stop_id
INNER JOIN trip on trip.trip_id = stop_time.trip_id
INNER JOIN route on route.route_id = trip.route_id
GROUP BY stop.stop_id, route.route_type 
ORDER BY stop.stop_id, route.route_type 

Этот запрос возвращает:

stop_id,route_type
1,0
1,3
2,0
3,3

Это означает, что stop_id = 1 имеет:

  • автобусных маршрутов,
  • трамвайных маршрутов.

stop_id = 2 имеет только трамвайные маршруты.

stop_id = 3 имеет только автобусные маршруты.

Я хотел бы вернуться:

stop_id,stop_type
1,multiple
2,tram
3,bus

А может быть, даже проще было бы изменить только те остановки, на которых есть автобусные и трамвайные маршруты. Так будет примерно так:

stop_id,stop_type
1,-1
2,0
3,3

Как этого добиться? Я не уверен, но думаю, что мне нужно посчитать количество строк на stop_id и затем каким-то образом изменить результат, но я не знаю, как это сделать.

1 Ответ

1 голос
/ 05 ноября 2019

Вы можете проверить COUNT DISTINCT route_type для каждого stop_id и, если оно больше 1, вывести multiple, в противном случае используйте MAX (или MIN, это не имеет значенияпоскольку существует только одно отдельное значение, но мы должны использовать функцию агрегирования, чтобы избежать нарушения группы по правилам) из route_type для установки stop_type в bus или tram:

SELECT stop.stop_id, 
       CASE WHEN COUNT(DISTINCT route.route_type) > 1 THEN 'multiple'
            WHEN MAX(route.route_type) = 0 THEN 'tram'
            ELSE 'bus'
       END AS stop_type
FROM stop
INNER JOIN stop_time on stop_time.stop_id = stop.stop_id
INNER JOIN trip on trip.trip_id = stop_time.trip_id
INNER JOIN route on route.route_id = trip.route_id
GROUP BY stop.stop_id
ORDER BY stop.stop_id
...