BigQuery报SELECT列未分组聚合错误 单车站点查询及JOIN咨询
问题1:报错修复方法
这个报错是写分组查询时的常见低级错误:SQL分组聚合规则要求,SELECT列表中所有未被聚合函数包裹的字段,必须全部出现在GROUP BY子句中。你代码里SELECT要查询的是出发站点trips.start_station_id,但GROUP BY分组时写的却是到达站点trips.end_station_id,两个字段不匹配,直接触发报错。
你的需求是查询累计使用时长最长的单车最常驶出的站点,只需要把GROUP BY后的trips.end_station_id修改为trips.start_station_id即可,修复后的完整可运行代码如下:
WITH longest_used_bike AS ( SELECT bikeid, SUM(duration_minutes) AS trip_duration FROM bigquery-public-data.austin_bikeshare.bikeshare_trips GROUP BY bikeid ORDER BY trip_duration DESC LIMIT 1 ) -- 查找最长使用单车最常出发的站点 SELECT trips.start_station_id, COUNT(*) AS trip_ct FROM longest_used_bike AS longest INNER JOIN `bigquery-public-data.austin_bikeshare.bikeshare_trips` AS trips ON longest.bikeid = trips.bikeid GROUP BY trips.start_station_id ORDER BY trip_ct DESC LIMIT 1
问题2:替换为FULL JOIN后的返回结果
分两种情况:
- 如果不修复上述分组字段不匹配的语法错误,不管把INNER JOIN换成哪种JOIN类型,语句都会抛出和之前完全一致的错误,无法返回任何查询结果。
- 如果先修复分组字段的bug,再把INNER JOIN替换为FULL JOIN,最终返回的是整个奥斯汀共享单车数据集中,被作为出发站使用次数最多的站点ID。
原因很简单:INNER JOIN只会保留和最长使用单车匹配的行程记录,统计范围仅限这台单车的所有行程;但FULL JOIN会保留左右两表所有匹配、不匹配的行,右表是全量所有单车的行程数据,所有不属于最长使用单车的行程记录都会被纳入COUNT(*)的统计范围,最终统计的是全量所有行程的出发站频次,取排序后的第一条结果自然是全数据集出发量最高的站点。
内容的提问来源于stack exchange,提问作者Name chane
相关产品推荐
相关产品推荐

