我在 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
Run Code Online (Sandbox Code Playgroud)
所以该表将如下所示:
row | one | two
-----------------------
1 | [a,b,c] | [1,2,3]
2 | [a,x] | [10,20]
Run Code Online (Sandbox Code Playgroud)
我想以这样的方式取消嵌套,即新表中的每一行都将具有第 1 列中的数组元素和第 2 列中的相应元素。因此,从上表中,我希望得到:
row | one | two
---------
1 | a | 1
2 | b | 2
3 | c | 3
4 | a | 10
5 | x | 20
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激!谢谢!
Mik*_*ant 12
以下适用于 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
Run Code Online (Sandbox Code Playgroud)
您可以使用问题中的示例数据来测试、玩上面的游戏 - 结果将是
Row one two
1 a 1
2 b 2
3 c 3
4 a 10
5 x 20
Run Code Online (Sandbox Code Playgroud)
我不太明白语法,你能解释一下吗?
解释:
对于下表中的每一行数组进行计算
ARRAY(
SELECT AS STRUCT one, two
FROM UNNEST(one) one WITH OFFSET
JOIN UNNEST(two) two WITH OFFSET
USING(OFFSET)
)
Run Code Online (Sandbox Code Playgroud)
该数组的元素是具有来自两列的各自值的结构 - 它们通过连接它们在初始数组中的位置(OFFSET)来相互匹配
然后这个数组被 UNNEST'ed 并与表中的相应行交叉 JOIN'ed - 并且整行实际上被忽略,只有 struct ( z) 被带入输出
z.*最后,使用的 不是输出结构而是作为单独的列
希望这有帮助:o)
| 归档时间: |
|
| 查看次数: |
1763 次 |
| 最近记录: |