【问题标题】:How to Group By all columns of table A when joining two tables to create one big nested table on BigQuery?连接两个表以在 BigQuery 上创建一个大嵌套表时,如何按表 A 的所有列进行分组?
【发布时间】:2021-04-25 21:07:11
【问题描述】:

我正在尝试创建一个由许多表组成的大型嵌套表,例如我的客户表、电话号码、电子邮件......它们都有共同的 client_id 字段。 目前我必须遵循运行良好的查询(“加入”客户表字段和相应的电话号码字段):

SELECT Clients.*, ARRAY_AGG( STRUCT(Timestamp, Country_Code, Local_Number, Phone_Number, Whatsapp)) as Phones
FROM Clients LEFT JOIN Phones USING(client_id)
GROUP BY Client.client_id, Clients.Timestamp, Clients.First_Name, Clients.Last_Name, Clients.DOB

Client.client_id, Clients.Timestamp, Clients.First_Name, Clients.Last_Name, Clients.DOB 是我在客户表中的所有字段。 我想将此查询用作子查询,以类似的方式将其“加入”到电子邮件表中(使用并重命名子查询的结果)。 问题是我想对客户表的所有字段进行分组,而不是每次都写。 GROUP BY Clients.* 和 GROUP BY ALL 都不起作用...

我能做些什么来缩短这个?

【问题讨论】:

    标签: sql group-by google-bigquery left-join nested-table


    【解决方案1】:

    如果client_id 是唯一的,那么您可以通过它进行聚合。您想要的是在执行此操作时获取所有列。一种非常类似于 BigQuery 的方法是:

    SELECT ANY_VALUE(c).*, 
           ARRAY_AGG( STRUCT(p.Timestamp, p.Country_Code, p.Local_Number, p.Phone_Number, p.Whatsapp)) as Phones
    FROM Clients c LEFT JOIN
         Phones p
         USING (client_id)
    GROUP BY c.client_id;
    

    当我运行它时效果很好:

    WITH clients as (
          select 'x' as name, 1 as client_id union all 
          select 'y' as name, 2 as client_id
        ),
        phones as (
            select current_timestamp as timestamp, 1 as client_id, 'abc' as country_code, 111 as local_number, 222 as phone_number, null as whatsapp
        )
    SELECT ANY_VALUE(c).*, 
           ARRAY_AGG( STRUCT(p.Timestamp, p.Country_Code, p.Local_Number, p.Phone_Number, p.Whatsapp)) as Phones
    FROM Clients c LEFT JOIN
         Phones p
         USING (client_id)
    GROUP BY c.client_id;
    

    【讨论】:

    • 问题是它不允许我仅按客户端 ID 分组。理论上它是唯一的,但我没有看到在 BigQuery 中将其定义为唯一的选项。
    • @Harvey 。 . .嗯?我从未在 BigQuery 中遇到过无法按某些列聚合的问题,无论它们是否唯一。 . .嗯,你可以试试group by c.client_id吗?
    • 当然我试过了,理论上这将是完美的。它只是不允许我这样做......然后它说 星形扩展表达式引用列 Timestamp,它在 [19:8] 处既不分组也不聚合。当我将它添加到 GROUP BY 时,它就是下一个字段,依此类推......直到我将所有字段添加到 GROUP BY
    • @Harvey 。 . .它确实需要c.client_id,但是当我运行它时代码运行良好。我添加了有效的示例代码。
    • 由于某些原因,现在它可以工作了...谢谢!!
    【解决方案2】:

    试试下面

    SELECT ANY_VALUE(c).*, 
      ARRAY_AGG((SELECT AS STRUCT p.* EXCEPT(client_id))) as Phones
    FROM Clients c 
    LEFT JOIN Phones p
    USING (client_id)
    GROUP BY c.client_id
    

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 2021-08-26
      • 2015-04-29
      • 2021-11-06
      • 2019-11-28
      • 2021-09-25
      • 2023-01-09
      • 2020-06-04
      • 2015-04-04
      相关资源
      最近更新 更多