Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用GTFS馈送检测停止类型_Sql_Postgresql_Gtfs - Fatal编程技术网

Sql 使用GTFS馈送检测停止类型

Sql 使用GTFS馈送检测停止类型,sql,postgresql,gtfs,Sql,Postgresql,Gtfs,我有一个GTFS提要,我正在尝试使用SQL检测stoptype(bus,tram或multiple)。为此,我必须获取每个站点的所有路线,并比较包含路线类型信息的route.route\u type字段(0-tram,3-bus) 我的问题是: 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 tri

我有一个GTFS提要,我正在尝试使用SQL检测stoptype(
bus
tram
multiple
)。为此,我必须获取每个站点的所有路线,并比较包含路线类型信息的
route.route\u type
字段(
0
-tram,
3
-bus)

我的问题是:

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具有:

  • 巴士路线,
  • 电车路线
车站id=2只有电车路线

站点id=3只有公共汽车路线

我想返回:

stop_id,stop_type
1,multiple
2,tram
3,bus
或者更简单的办法是只修改这些有公共汽车和电车路线的车站。所以应该是这样的:

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

如何达到这个效果?我不确定,但我认为我应该计算每个站点id的行数,然后以某种方式修改结果,但我不知道如何进行修改。

您可以检查每个
站点id的不同
路由类型的
计数
,如果它大于1,则输出
多个
,否则使用
MAX
(或
MIN
,这没关系,因为只有一个不同的值,但我们必须使用聚合函数以避免违反分组规则)的
route\u type
stop\u 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

您可以检查每个
站点id
的不同
路由类型的
计数
,如果大于1,则输出
多个
,否则使用
最大值
(或
MIN
,这没关系,因为只有一个不同的值,但我们必须使用聚合函数以避免违反分组规则)的
route\u type
stop\u 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

嗯,它到处都返回
multiple
。但是,当我将
count(route.route\u type)
修改为
count(distinct route.route\u type)时
它就像一个符咒!谢谢你!@Marcin对此表示抱歉-从你问题中的数据中不清楚可能有多个类似的值。我很高兴你找到了它。我已经更新了答案以供将来参考。嗯,它到处返回
多个
。但是,当我修改
计数(route.route\u type)时
to
count(distinct route.route\u type)
它就像一个符咒一样工作!谢谢!@Marcin对此表示抱歉-从您问题中的数据中不清楚可能有多个类似的值。我很高兴您找到了它。我已经更新了答案以供将来参考。