问题描述
我正在尝试创建一个大型嵌套表,该表将由许多表组成,例如我的客户表、电话号码、电子邮件......它们都有共同的 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.dob
是我在 Clients 表中的所有字段。
我想将此查询用作子查询,以类似的方式将其“加入”到 Emails 表中(使用和重命名子查询的结果)。
问题是我想对 Clients 表的所有字段进行 GROUP BY,而不是每次都写它们。 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).*,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