Google bigquery 如何在没有交叉乘积的情况下,从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
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谢谢你,米哈伊尔,效果很好。但是我不完全理解语法,你能解释一下吗?谢谢谢谢你,米哈伊尔,很好用。但是我不完全理解语法,你能解释一下吗?谢谢