我们如何构造一个struct数组,其中数组的每一行对应于具有相同行号的几个数组列?
我将向您展示一个示例,以更好地说明我的问题。
因此,这里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组成的结构,如下表所示:
请注意,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
谢谢。
答案 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