使用 GTFS 提要检测停止类型

Detect stop type using GTFS feed

我有一个 GTFS 提要,我正在尝试使用 SQL 检测停止类型(bustrammultiple)。为此,我必须获取每个站点的所有路线并比较 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 

这个查询 returns:

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

这意味着 stop_id = 1 有:

stop_id = 2 只有电车路线。

stop_id = 3 只有巴士路线。

我愿意return:

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

或者更简单的方法是只修改这些有公共汽车和电车路线的站点。所以它会是这样的:

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

如何实现这个结果?我不确定,但我认为我应该计算每个 stop_id 的行数,然后以某种方式修改结果,但我不知道该怎么做。

你可以检查每个stop_id的DISTINCT route_typeCOUNT,如果大于1则输出multiple,否则使用MAX(或MIN,这无关紧要,因为只有一个不同的值,但我们必须使用聚合函数来避免违反分组规则)route_type 来设置stop_typebustram:

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