为何此SQL查询无法正确聚合Route并统计num_trips?
GROUP BY子句错误原因及修正方案
原始代码:
SELECT subscriber_type, CONCAT( start_station_name, " to ", end_station_name ) AS Route, COUNT(*) AS num_trips, FROM `bigquery-public-data.san_francisco.bikeshare_trips` GROUP BY Route, num_trips
数据集字段:
subscriber_type:取值为temp或subscriberstart_station_name:自行车出行的起始站点名称end_station_name:自行车出行的结束站点名称Route:通过拼接起始站点与结束站点生成的自定义列num_trips:你想要统计的各Route对应的总出行次数
错误信息:
Column num_trips contains an aggregation function, which is not allowed in GROUP BY at [6:17]
错误原因及逻辑纠正:
- num_trips不能放在GROUP BY里:
num_trips是用COUNT(*)计算出来的聚合结果,属于分组后才生成的值,不是用来划分分组的维度字段。GROUP BY的作用是指定“按哪些字段归组”,聚合函数是对每个分组做统计计算,你把统计结果当成分组依据,逻辑完全颠倒了。 - SELECT非聚合列必须出现在GROUP BY中:你的SELECT里包含了
subscriber_type,但GROUP BY里没写这个字段,这在标准SQL里不允许——要么把它加入GROUP BY,要么去掉这个字段的查询。
修正后的代码:
如果需要区分不同用户类型的路线出行次数:
SELECT subscriber_type, CONCAT(start_station_name, " to ", end_station_name) AS Route, COUNT(*) AS num_trips FROM `bigquery-public-data.san_francisco.bikeshare_trips` GROUP BY subscriber_type, Route
如果不需要区分用户类型,只统计每条路线的总次数:
SELECT CONCAT(start_station_name, " to ", end_station_name) AS Route, COUNT(*) AS num_trips FROM `bigquery-public-data.san_francisco.bikeshare_trips` GROUP BY Route
逻辑说明:
GROUP BY指定的是用来分组的维度(比如路线、用户类型),数据库会把相同维度值的行归为一组,然后对每组执行COUNT(*),得到该组的出行次数,也就是你需要的num_trips。
内容的提问来源于stack exchange,提问作者amc439
相关产品推荐
相关产品推荐

