当前位置: 首页 > 面试题库 >

BigQuery联接三个表

金瑞
2023-03-14
问题内容

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

我想生成一个最终表,该表具有按类别和设备平台划分的表1和表2的计数。但是,每次运行此命令时,我都会收到一条错误消息,指出
join.t3.category不是join中任何一个表的字段

这是我当前的代码:

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;

问题答案:

简单的解决方法是category在第一个内部添加字段SELECT-否则最外面不可见SELECT-因此出错!那就是问题!

另外,在BigQuery旧版SQL中,您可以使用EXACT_COUNT_DISTINCT,否则您将获得统计近似值-在COUNT([DISTINCT])中查看更多

因此,对于旧版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


 类似资料:
  • 问题内容: 我正在尝试运行以下查询,但继续遇到相同的错误 查询失败错误:在第6行第33列遇到“”。 查询是: 从[Dataset1.1_0_MEMBER_GROUP]中 选择1_0_MEMBER_GROUP.User_Group, 1_0_MEMBER_GROUP.Member_ID, 1_4_MEMBER_TRAN_YEAR.MEMBER_UID 在1_0_MEMBER_GROUP_YEAR_M

  • 问题内容: 我有三个表:R,S和P。 表R通过外键与S连接;有 应该 是S中至少一个的记录,所以我可以加入: 如果S中没有记录,那么我没有行,那很好。 然后表S与P联接,其中记录为P可能存在,也可能不存在,并与S联接。 所以我做 如果我想将第二个JOIN绑定到S而不是R,例如我可以使用括号,该怎么办: 还是这已经是R,S和P之间笛卡尔积的自然行为? 问题答案: 各种外部联接和普通联接都在相同的优先

  • 问题内容: 我正在使用此查询: 产生以下结果: 我改变了场CAT_ID到一个名为新表包含的字段,,。我如何通过也加入该表来编写新查询,以获得与上述相同的结果? 我是数据库新手,需要帮助。提前致谢 问题答案: 试试这个: 这个想法很简单,在新表中的第一个字段是工作作为 代理键 ,它没有任何与其他两个表之间的关系。然后,我们来到了另外两个领域是哪些,这些你应该映射到关系的其他两个方面。 您不能使用新模

  • 问题内容: 我有三个表:“产品”,“购买”,“发票” 产品表 : Producct_no听名字 1引用 2听B 3引用C 采购表 : purchase_no听产品_no数量 001引用1听81 002引用150 003引用3引用10 发票表 : Invoice_no听产品_no数量 001引用1引用20 002引用10 003引用3引用10 我想获取每种产品的购买数量和发票数量,我使用以下查询 p

  • 问题内容: 谁能告诉我如何编写查询并如上所述获取结果,谢谢!我试过加入,左右加入。一切都没有结果。 问题答案: 您可以在这两个表之间写左外部联接最好的理解方法是检查下图 查询您的要求 阅读有关 代码项目的 原始文章将对您有很大帮助:SQL Joins的可视表示 。 在以下位置找到原始版本:MySQL中的JOIN和OUTER JOIN之间的区别 。

  • 如果我有三个表: > 列出所有未被查看的正确方法是什么?此查询是否正确? 按< code>user_id列出所有< code >帖子及其“查看状态”如何? 您是否也可以推荐一个很棒的(用户友好的、非极客的)资源来提高我对LEFT JOIN、CROSS JOIN和(正常连接?从帖子、视图中选择*)的理解? 谢谢大家!