如何在 BigQuery 的左联接查询中按所有字段嵌套表进行分组?

问题描述

我有大约 10 个表,我使用以下查询通过回合制作了一个大嵌套表:

   R1 AS(
      SELECT ANY_VALUE(Table1).*,ARRAY_AGG(( SELECT AS STRUCT Table2.* EXCEPT(ID))) AS Table2
      FROM Table1 LEFT JOIN Table2 USING(ID)
      GROUP BY Table1.ID),R2 AS(
      SELECT ANY_VALUE(R1).*,ARRAY_AGG(( SELECT AS STRUCT Table3.* EXCEPT(ID))) AS Table3
      FROM R1 LEFT JOIN Table3 USING(ID)
      GROUP BY R1.ID),...

  
   SELECT ANY_VALUE(R9).*,ARRAY_AGG(( SELECT AS STRUCT Table10.* EXCEPT(ID))) AS Table10
   FROM R9 LEFT JOIN Table10 USING(ID)

问题是,例如在我的第一个表中,我可以有两个具有相同 ID 的记录,但其他一些字段会有所不同,我想将它们视为两个不同的记录,因此按表的所有字段分组,同时我加入。 然后我想对所有“子表”(查询中的 R 表)做同样的事情,这样我就可以按嵌套表的所有字段进行分组。

我怎样才能轻松做到?

我尝试了 GROUP BY Table1.* 但它不起作用...

提前致谢

解决方法

如何按所有字段分组...?
我试过 GROUP BY Table1.* 但它不起作用...

考虑下面的例子

SELECT ANY_VALUE(t1).*,ARRAY_AGG(( SELECT AS STRUCT t2.* EXCEPT(ID))) AS Table2
FROM Table1 t1 LEFT JOIN Table2 t2 USING(ID)
GROUP BY FORMAT('%t',t1)
,

试试to_json_string

...
FROM Table1 t1
...
GROUP BY to_json_string(t1)
,

你似乎想要这样的东西:

select *
from table1 t1 left join
     (select t2.*
      from table2 t2
      where true
      qualify row_number() over (partition by t2.id order by t2.id) = 0
     ) t2
     using (id)

这使用 qualify 而不是 group by 来获取一行。

如果您不想要来自 table1 的所有行,您也可以减少它们:

select *
from (select t1.* 
      from table1 t1
      where true
      qualify row_number() over (partition by id,col1,col2 order by id) = 1
     ) t1 left join
     (select t2.*
      from table2 t2
      where true
      qualify row_number() over (partition by t2.id order by t2.id) = 0
     ) t2
     using (id)