为何SQL查询中别名‘overall_avg’无法生效?求技术解答
你的查询报错是因为SQL的SELECT子句是按从左到右的顺序解析的——你在定义overall_avg之前就试图用它计算difference,数据库自然找不到这个别名。另外你重复写了两次difference列,这也是多余的。
下面给你两种可行的修正方案:
方案1:调整列顺序(简单直观,适合快速验证)
把全局平均的子查询移到difference前面,让数据库先解析overall_avg,再用它计算差值:
SELECT start_station_id, AVG(tripduration) AS duration_per_station, -- 先定义全局平均别名 (SELECT AVG(tripduration) FROM bigquery-public-data.new_york_citibike.citibike_trips) AS overall_avg, -- 此时可以正常使用已定义的别名 overall_avg - duration_per_station AS difference FROM bigquery-public-data.new_york_citibike.citibike_trips GROUP BY start_station_id
注意:这种方法的缺点是每个分组都会执行一次子查询计算全局平均,数据量大时效率偏低。
方案2:用窗口函数/CTE(更高效,推荐)
方式A:窗口函数直接计算全局平均
用AVG() OVER ()窗口函数,不带分区条件时会直接计算整个表的平均值,且只计算一次,性能更优:
SELECT start_station_id, AVG(tripduration) AS duration_per_station, -- OVER()无分区,计算全表平均 AVG(tripduration) OVER () AS overall_avg, AVG(tripduration) OVER () - AVG(tripduration) AS difference FROM bigquery-public-data.new_york_citibike.citibike_trips GROUP BY start_station_id
方式B:CTE预计算全局平均
如果觉得窗口函数写法重复,也可以用CTE先算出全局平均,再关联查询:
WITH global_avg AS ( SELECT AVG(tripduration) AS overall_avg FROM bigquery-public-data.new_york_citibike.citibike_trips ) SELECT t.start_station_id, AVG(t.tripduration) AS duration_per_station, g.overall_avg, g.overall_avg - AVG(t.tripduration) AS difference FROM bigquery-public-data.new_york_citibike.citibike_trips t CROSS JOIN global_avg g GROUP BY t.start_station_id, g.overall_avg
内容的提问来源于stack exchange,提问作者Ana Kace
相关产品推荐
相关产品推荐

