如何在连接两个 table 以在 BigQuery 上创建一个大嵌套 table 时按 table A 的所有列分组?

How to Group By all columns of table A when joining two tables to create one big nested table on BigQuery?

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

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 是我在客户 table 中的所有字段。 我想将此查询用作子查询,以类似的方式将其“加入”电子邮件 table(使用 with 并重命名子查询的结果)。 问题是我想 GROUP BY Clients table 的所有字段而不是每次都写出来。 GROUP BY Clients.* 和 GROUP BY ALL 都不起作用...

我可以做些什么来缩短它?

如果 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;

试试下面

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