【问题标题】:How to Group By all fields nested tables in a Left Join query in BigQuery?如何在 BigQuery 的左联接查询中按所有字段嵌套表进行分组?
【发布时间】:2021-08-26 07:01:07
【问题描述】:

我有大约 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.*,但它不起作用...

提前谢谢你

【问题讨论】:

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


    【解决方案1】:

    你似乎想要这样的东西:

    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)
    

    【讨论】:

    • 如何用这个创建嵌套数据?我应该插入它而不是我的 R1 AS() 部分吗?
    • qualify row_number() over (partition by t2.id order by t2.id) = 0 行到底是做什么的?为什么要在子查询中使用它?
    • @Harvey 。 . .你可以选择任何你想要的。这解决了您关于从table2table1 中的每一行返回一个匹配项的问题。
    【解决方案2】:

    如何按所有字段分组...?
    我尝试了 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)
    

    【讨论】:

      【解决方案3】:

      试试to_json_string:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-17
        • 1970-01-01
        • 2021-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        相关资源
        最近更新 更多