如何在连接两个 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
我正在尝试创建一个由许多 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