【问题标题】:BigQuery join of three tables三个表的 BigQuery 连接
【发布时间】:2016-09-20 15:17:00
【问题描述】:

我正在尝试在 BigQuery 中加入三个表;表 1 有一个事件的记录(即每一行是一个记录),表 2 有第二个事件的记录,表 3 有类别名称。

我想按类别和设备平台生成一个包含表 1 和表 2 计数的最终表。但是,每次我运行它时,我都会收到一条错误消息,提示 joined.t3.category 不是连接中任一表的字段

这是我当前的代码:

Select count(distinct joined.t1.Id) as t1_events, count(distinct t2.Id) as t2_events, joined.t1.Origin as platform, joined.t3.category as category

from 

(

SELECT 
        Id,
        Origin,
        CatId

    FROM [testing.table_1] as t1

JOIN (SELECT category,
            CategoryID

FROM [testing.table_3]) as t3

on t1.CatId = t3.CategoryID

) AS joined

JOIN (SELECT Id,
            CategoryId

FROM [testing.table_2]) as t2

ON (joined.t1.CatId = t2.CategoryId)    

Group by platform,category;

作为参考,下面是表 1 和表 2 之间的一个更简单的连接,效果很好:

Select count(distinct t1.Id) as t1_event, count(distinct t2.Id) as t2_events, t1.Origin as platform

from testing.table_1 as t1

JOIN testing.table_2 as t2

on t1.CatId = t2.CategoryId

Group by platform;

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    简单的解决方法是在第一个内部SELECT 中添加category 字段 - 否则最外面的SELECT 看不到它 - 因此出现错误!这就是问题所在!

    此外,在 BigQuery Legacy SQL 中,您可以使用 EXACT_COUNT_DISTINCT 否则您会得到统计近似值 - 请参阅 COUNT([DISTINCT]) 中的更多信息

    因此,对于 Legacy SQL,您的查询可能如下所示:

    SELECT
      EXACT_COUNT_DISTINCT(joined.t1.Id) AS t1_events,
      EXACT_COUNT_DISTINCT(t2.Id) AS t2_events,
      joined.t1.Origin AS platform,
      joined.t3.category AS category
    FROM (
      SELECT
        Id, Origin, CatId, category
      FROM [testing.table_1] AS t1
      JOIN (SELECT category, CategoryID FROM [testing.table_3]) AS t3
      ON t1.CatId = t3.CategoryID 
    ) AS joined
    JOIN (SELECT Id, CategoryId FROM [testing.table_2]) AS t2
    ON joined.t1.CatId = t2.CategoryId
    GROUP BY platform, category
    

    此外,我觉得您可以进一步简化它(假设不会有歧义的字段)

    SELECT
      EXACT_COUNT_DISTINCT(joined.t1.Id) AS t1_events,
      EXACT_COUNT_DISTINCT(t2.Id) AS t2_events,
      joined.t1.Origin AS platform,
      joined.t3.category AS category
    FROM (
      SELECT
        Id, Origin, CatId, category
      FROM [testing.table_1] AS t1
      JOIN [testing.table_3] AS t3
      ON t1.CatId = t3.CategoryID 
    ) AS joined
    JOIN [testing.table_2] AS t2
    ON joined.t1.CatId = t2.CategoryId
    GROUP BY platform, category
    

    当然,如果您使用标准 SQL 版本,您将需要进行相同的修复(正如 Elliott 建议的那样:

    SELECT
      COUNT(DISTINCT joined.t1.Id) AS t1_events,
      COUNT(DISTINCT t2.Id) AS t2_events,
      joined.t1.Origin AS platform,
      joined.t3.category AS category
    FROM (
      SELECT 
        Id, Origin, CatId, category
      FROM `testing.table_1` AS t1
      JOIN `testing.table_3` AS t3
      ON t1.CatId = t3.CategoryID
    ) AS joined
    JOIN `testing.table_2` AS t2
    ON joined.t1.CatId = t2.CategoryId
    GROUP BY platform, category 
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用standard SQL 代替您的查询吗?它对别名有更好的处理,COUNT(DISTINCT ...) 会给你一个准确的结果,而不是像旧版 SQL 中的近似值。如果有帮助,您应该对查询进行的唯一更改是使用反引号来转义表名而不是括号。例如:

      SELECT
        COUNT(DISTINCT joined.t1.Id) as t1_events,
        COUNT(DISTINCT t2.Id) as t2_events,
        joined.t1.Origin as platform,
        joined.t3.category as category
      FROM (
        SELECT 
          Id,
          Origin,
          CatId
        FROM `testing.table_1` AS t1
        JOIN (
          SELECT
            category,
            CategoryID
          FROM `testing.table_3`
        ) AS t3
        ON t1.CatId = t3.CategoryID
      ) AS joined
      JOIN (
        SELECT
          Id,
          CategoryId
        FROM `testing.table_2`
      ) AS t2
      ON joined.t1.CatId = t2.CategoryId
      GROUP BY platform, category;
      

      【讨论】:

        【解决方案3】:

        我不知道 google-bigquery,但我的 SQL 知识告诉我,在列名之前有两个别名会导致问题。尝试在joined 之后删除t-aliases,例如使用joined.category 而不是joined.t3.category

        【讨论】:

          猜你喜欢
          • 2022-01-15
          • 2016-12-20
          • 2018-11-06
          • 2014-02-24
          • 1970-01-01
          • 1970-01-01
          • 2016-10-18
          • 2018-05-13
          • 1970-01-01
          相关资源
          最近更新 更多