如何在BigQuery中将数组列合并到struct数组中?

时间:2019-06-20 04:12:54

标签: google-bigquery

我们如何构造一个struct数组,其中数组的每一行对应于具有相同行号的几个数组列?

我将向您展示一个示例,以更好地说明我的问题。

假设我要查询一个名为table_1的表,该表如下所示: Example table

因此,这里col_2,col_3,col_4和col_5都是BigQuery中的数组列。我知道table_1中的col_2,col_3和col_4总是具有相同的行数。我需要将它们连接到一个结构数组中,其中数组列中每一行的组合将在新数组中形成一个结构行。所以结果数组将是(x,1,s),(y,2,t)和(z,3,u)

假定此串联的列称为comb_col。此comb_col本质上是一个结构数组。每一行都是一个由col_2,col_3和col_4组成的结构,如下表所示: Example table2

请注意,comb_col的值应为(x,1,s),(y,2,t)和(z,3,u),而不是([x,y,z],[1, 2,3],[s,t,u])

最简单的方法是什么?我尝试将UNNEST与交叉联接一起使用,但这将实现CROSS JOIN,而不是CONCATENATION(因此,在上面的示例中,将产生9行而不是3列组合列)。

我考虑过将行号与ROW_NUMBER()一起使用,并使用交叉联接进行UNNEST,然后仅过滤具有相同行号的那些行,如下所示。我的解决方案实现了我想要的,但是,该解决方案有点罗word且复杂。有没有更好,更简单的方法可以实现我的目标?

CREATE TEMP FUNCTION ADD_ROW_NUMBER(arr ANY TYPE) AS (
  ARRAY(
    SELECT AS STRUCT
      data, 
      row_number() OVER () AS rn
    FROM UNNEST(arr) data
  )
); 

SELECT
  id, 
  col_1,
  ARRAY(
    (SELECT AS STRUCT
        c2.data AS col_1, 
        c3.data AS col_2,
        c4.data AS col_3
      FROM 
        UNNEST(ADD_ROW_NUMBER(col_1)) c1, 
        UNNEST(ADD_ROW_NUMBER(col_2)) c2, 
        UNNEST(ADD_ROW_NUMBER(col_3)) c3 
      WHERE c1.rn = c2.rn AND c2.rn = c3.rn)
  ) AS comb_col,
  col_5,
  ARRAY(
    SELECT 
      col_5 * 10
  ) AS col_5_times_10
FROM table_1

谢谢。

1 个答案:

答案 0 :(得分:2)

  

是否有更好,更简单的方法来实现我的目标?

以下是用于BigQuery标准SQL

Row id  col_1   comb_col.col_2  comb_col.col_3  comb_col.col_4  col_5    
1   1   a       x               1               s               4    
                y               2               t               5    
                z               3               u        

这可能是个见解-但对我来说似乎不那么冗长

很明显,如果适用于您提出的问题的样本数据-结果符合预期

80:81