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;
我正在尝试在计算字段上连接两个 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;