BigQuery 加入计算字段

BigQuery Join on Calculated Field

我正在尝试在计算字段上连接两个 table:

SELECT
  CONCAT(year, mo, da) AS date,
  temp
FROM
  [bigquery-public-data:noaa_gsod.gsod2016] AS a
JOIN
  [bigquery-public-data:noaa_gsod.stations] AS b
ON
  a.stn = b.usaf
  AND a.wban = b.wban
JOIN
  [test-project:0000.ga_sessions_20161002] AS c
ON
  c.date = CONCAT(a.year, a.mo, a.da)
WHERE
  b.name = "DUBAI INTL"
ORDER BY
  a.year ASC,
  a.mo ASC,
  a.da ASC

我不断收到以下错误:

ON clause must be AND of = comparisons of one field name from each table, with all field names prefixed with table name

我认为此错误是第二个 ON 语句的结果,但我已在所有字段名称前加上它们的 table 名称前缀。

我做错了什么?

尝试使用子查询:

FROM (SELECT a.*, date(CONCAT(a.year, a.mo, a.da)) as yyyymmdd
      FROM [bigquery-public-data:noaa_gsod.gsod2016] a
     ) a JOIN
     [bigquery-public-data:noaa_gsod.stations] b
     ON a.stn = b.usaf AND a.wban = b.wban JOIN
     [test-project:0000.ga_sessions_20161002] c
     ON c.date = a.yyyymmdd

或者像这样的东西。 . .确切的比较可能取决于 c.date.

的类型

默认情况下,您使用的 JOIN 是 INNER JOIN,因此 ON 子句只能对列进行简单的相等处理。

要解决此问题,您需要使用带有 WHERE 子句的 CROSS JOIN:

SELECT
  CONCAT(year, mo, da) AS date,
  temp
FROM
  [bigquery-public-data:noaa_gsod.gsod2016] AS a
JOIN
  [bigquery-public-data:noaa_gsod.stations] AS b
ON
  a.stn = b.usaf
  AND a.wban = b.wban
CROSS JOIN
  [test-project:0000.ga_sessions_20161002] AS c
WHERE
  b.name = "DUBAI INTL"
AND
  c.date = CONCAT(a.year, a.mo, a.da)
ORDER BY
  a.year ASC,
  a.mo ASC,
  a.da ASC

您需要为查询启用 standard SQL。完成后(取消选中 "Show Options" 下的 "Use Legacy SQL"),您可以 运行 例如:

SELECT
  CONCAT(year, mo, da) AS date,
  temp
FROM
  `bigquery-public-data.noaa_gsod.gsod2016` AS a
JOIN
  `bigquery-public-data.noaa_gsod.stations` AS b
ON
  a.stn = b.usaf
  AND a.wban = b.wban
JOIN
  `test-project.0000.ga_sessions_20161002` AS c
ON
  c.date = CONCAT(a.year, a.mo, a.da)
WHERE
  b.name = "DUBAI INTL"
ORDER BY
  a.year ASC,
  a.mo ASC,
  a.da ASC;

这里还有一个不依赖于 ga_session table 的独立示例:

WITH MyTable AS (
  SELECT '20161003' AS date UNION ALL
  SELECT '20160830'
)
SELECT
  CONCAT(year, mo, da) AS date,
  temp
FROM
  `bigquery-public-data.noaa_gsod.gsod2016` AS a
JOIN
  `bigquery-public-data.noaa_gsod.stations` AS b
ON
  a.stn = b.usaf
  AND a.wban = b.wban
JOIN
  MyTable AS c
ON
  c.date = CONCAT(a.year, a.mo, a.da)
WHERE
  b.name = "DUBAI INTL"
ORDER BY
  a.year ASC,
  a.mo ASC,
  a.da ASC;