使用 GTFS 提要检测停止类型
Detect stop type using GTFS feed
我有一个 GTFS 提要,我正在尝试使用 SQL 检测停止类型(bus
、tram
或 multiple
)。为此,我必须获取每个站点的所有路线并比较 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_type
的COUNT
,如果大于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
我有一个 GTFS 提要,我正在尝试使用 SQL 检测停止类型(bus
、tram
或 multiple
)。为此,我必须获取每个站点的所有路线并比较 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_type
的COUNT
,如果大于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