【问题标题】:Detect stop type using GTFS feed使用 GTFS 提要检测停止类型
【发布时间】:2019-11-05 12:46:56
【问题描述】:

我有一个 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 

此查询返回:

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 的行数,然后以某种方式修改结果,但我不知道如何制作。

【问题讨论】:

    标签: sql postgresql gtfs


    【解决方案1】:

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

    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
    

    【讨论】:

    • 嗯,它到处都返回multiple。但是,当我将 count(route.route_type) 修改为 count(distinct route.route_type) 时,它就像一个魅力!谢谢!
    • @Marcin 对此感到抱歉 - 从您问题中的数据中不清楚可能有多个相似的值。我很高兴你明白了。我已经更新了答案以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多