Google bigquery 如何在没有交叉乘积的情况下,从BigQuery中的两列中取消显示两个列表(作为单独的行)

Google bigquery 如何在没有交叉乘积的情况下,从BigQuery中的两列中取消显示两个列表(作为单独的行),google-bigquery,Google Bigquery,我在BigQuery中有一个表,它有两列,每列包含一个数组。对于给定的行,两列将包含相同长度的数组,但该长度可能因行而异: WITH tbl AS ( select ['a','b','c'] AS one, [1,2,3] as two union all select ['a','x'] AS two, [10,20] as two ) select * from tbl 因此,该表将如下所示: row | one | two ----------------------- 1

我在BigQuery中有一个表,它有两列,每列包含一个数组。对于给定的行,两列将包含相同长度的数组,但该长度可能因行而异:

WITH tbl AS (
select ['a','b','c'] AS one, [1,2,3] as two
union all
select ['a','x'] AS two, [10,20] as two
)
select * from tbl
因此,该表将如下所示:

row | one     | two
-----------------------
1   | [a,b,c] | [1,2,3]
2   | [a,x]   | [10,20]
我希望以这样一种方式取消测试:新表中的每一行都有一个column1中的数组元素和column2中的对应元素。因此,从上表中,我希望得到:

row | one | two
---------
1   | a   | 1
2   | b   | 2
3   | c   | 3
4   | a   | 10
5   | x   | 20


任何帮助都将不胜感激!谢谢

下面是BigQuery标准SQL

#standardSQL
SELECT z.*
FROM `project.dataset.table` t,
UNNEST(ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
  )
) z
您可以使用问题中的样本数据测试、玩上面的游戏-结果将是

Row one two  
1   a   1    
2   b   2    
3   c   3    
4   a   10   
5   x   20     
我不太懂语法,你能解释一下吗

说明:

第一步 对于下表中的每一行,将计算数组

ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
)  
这个数组的元素是两列中各有一个值的结构-它们通过在初始数组中的位置上联接而相互匹配

步骤2 然后这个数组被取消嵌套,并与表中相应的行交叉连接,整个行实际上被忽略,只有struct z被引入到输出中

步骤3 最后要输出的不是一个结构,而是一个单独的列,使用-z.*


希望这有帮助:下面的o

是用于BigQuery标准SQL的

#standardSQL
SELECT z.*
FROM `project.dataset.table` t,
UNNEST(ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
  )
) z
您可以使用问题中的样本数据测试、玩上面的游戏-结果将是

Row one two  
1   a   1    
2   b   2    
3   c   3    
4   a   10   
5   x   20     
我不太懂语法,你能解释一下吗

说明:

第一步 对于下表中的每一行,将计算数组

ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
)  
这个数组的元素是两列中各有一个值的结构-它们通过在初始数组中的位置上联接而相互匹配

步骤2 然后这个数组被取消嵌套,并与表中相应的行交叉连接,整个行实际上被忽略,只有struct z被引入到输出中

步骤3 最后要输出的不是一个结构,而是一个单独的列,使用-z.*


希望这有帮助:o

谢谢你,米哈伊尔,效果很好。但是我不完全理解语法,你能解释一下吗?谢谢谢谢你,米哈伊尔,很好用。但是我不完全理解语法,你能解释一下吗?谢谢