You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google BigQuery关联两数据集时子查询无法按年返回数据

解决BigQuery子查询未按年份返回平均气温的问题

嘿,我一眼就看出问题出在哪啦!你单独跑子查询时能按年份返回平均气温,但嵌入主查询后变成全局平均,核心原因是你的子查询没有和主查询的年份做关联,导致它计算的是所有年份的整体平均,而不是对应主查询每行的年份平均。

先看看你提供的代码片段(我补全了部分省略的内容以便理解):

#standardSQL
SELECT 
  t1.year, 
  gas_fuel, 
  liquid_fuel, 
  solid_fuel, 
  cement, 
  annual_anomaly, 
  (SELECT avg(temp) FROM `bigquery-public-data.noaa_gsod.gsod*` WHERE year >= 1990 AND year <= 2010) AS avg_temp
FROM 
  `your_main_dataset.your_main_table` t1
WHERE 
  t1.year >= 1990 AND t1.year <= 2010

问题分析

上面的子查询没有和主查询的t1.year建立关联,所以不管主查询的行是哪一年,子查询都会返回1990-2010所有年份的气温平均值,自然就没法按年返回了。

修正后的相关子查询写法

你需要在子查询的WHERE条件里加上year = t1.year,让子查询针对主查询每行的年份单独计算平均值:

#standardSQL
SELECT 
  t1.year, 
  gas_fuel, 
  liquid_fuel, 
  solid_fuel, 
  cement, 
  annual_anomaly, 
  -- 子查询关联主查询的年份,计算对应年份的平均气温
  (SELECT avg(temp) 
   FROM `bigquery-public-data.noaa_gsod.gsod*` 
   WHERE year = t1.year  -- 关键:关联主查询的year字段
     AND year >= 1990 AND year <= 2010) AS annual_avg_temp
FROM 
  `your_main_dataset.your_main_table` t1
WHERE 
  t1.year >= 1990 AND t1.year <= 2010

更高效的JOIN写法(推荐)

如果数据量较大,相关子查询可能性能一般,你也可以用CTE预计算出每年的平均气温,再和主表关联,这种写法更清晰且性能更优:

#standardSQL
WITH annual_temp_avg AS (
  SELECT 
    year, 
    avg(temp) AS annual_avg_temp
  FROM `bigquery-public-data.noaa_gsod.gsod*`
  WHERE year >= 1990 AND year <= 2010
  GROUP BY year
)
SELECT 
  t1.year, 
  gas_fuel, 
  liquid_fuel, 
  solid_fuel, 
  cement, 
  annual_anomaly, 
  ata.annual_avg_temp
FROM 
  `your_main_dataset.your_main_table` t1
JOIN 
  annual_temp_avg ata ON t1.year = ata.year
WHERE 
  t1.year >= 1990 AND t1.year <= 2010

内容的提问来源于stack exchange,提问作者lauvdb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:47:54