【问题标题】:BigQuery Join on Calculated Field计算字段上的 BigQuery 联接
【发布时间】:2016-11-15 17:13:01
【问题描述】:

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

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 子句必须是 AND of = 每个字段名称的比较 表,所有字段名都以表名为前缀

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

我做错了什么?

【问题讨论】:

  • 不要使用表 a,而是使用为您执行所需功能的子查询。顺便说一句,c.date 是一个字符串吗?

标签: sql join google-bigquery calculated-columns


【解决方案1】:

您需要为查询启用standard SQL。完成后(取消选中“显示选项”下的“使用旧版 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 表的独立示例:

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;

【讨论】:

  • 谢谢!那成功了。我有点困惑,为什么您在顶部添加了 MyTable 定义,但在我查找了 UNION ALL 运算符之后,这才有意义。我认为最好在答案中恢复使用ga_sessions_20161002 表,这样可以更清楚地了解答案与问题的直接关系。
  • 当然,我更新了示例以使用您的原始表格,但我也留下了独立示例,以防其他读者想尝试一下。谢谢!
【解决方案2】:

尝试使用子查询:

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 的类型。

【讨论】:

    【解决方案3】:

    您使用的 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
    

    【讨论】:

    • 这意味着在过滤之前计算两个表的整个叉积。在INNER JOIN 之前的子查询中计算CONCAT(...) 或使用standard SQL 会更好。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 2016-09-05
    • 2023-03-03
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多