跨 BigQuery 中的多个字段拆分函数 SQL
Split function across multiple fields in BigQuery SQL
我有这样的数据:
每列在一行中将具有相同数量的元素,其中第一列中的第一个元素对应于第二列中的第一个元素,依此类推。
我怎样才能将其展平以获得下面的内容?
对于单个列,我可以通过将 CROSS JOIN
与 UNNEST
组合来实现此目的,但我无法将其用于多个列,因为连接最终会创建多个变体并且 UNNEST
丢失了数组的顺序所以我无法匹配它们。
如果我从头开始构建数组,我会在其中使用某种 STRUCT
元素,但是当数组是从 [=15 创建的时,我找不到这样做的方法=]?
WITH_OFFSET
是你的朋友:
WITH strings AS (
SELECT "a,b,c" a, "aa,bb,cc" b
UNION ALL
SELECT "a1,b1,c1" a, "aa1,bb1,cc1" b
)
SELECT x_a, x_b
FROM strings
, UNNEST(SPLIT(a)) x_a WITH OFFSET o_a
JOIN UNNEST(SPLIT(b)) x_b WITH OFFSET o_b
ON o_a=o_b
BigQuery Standard SQL 的另一种方法如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 'a|b|c' col1, 'n|o|p' col2 UNION ALL
SELECT 2, 'd|e', 'q|r' UNION ALL
SELECT 3, 'f|g|h|i', 's|t|u|v' UNION ALL
SELECT 4, 'j', 'w' UNION ALL
SELECT 5, 'k|l|m', 'x|y|z'
)
SELECT
id,
SPLIT(col1, '|')[SAFE_ORDINAL(pos)] value1,
SPLIT(col2, '|')[SAFE_ORDINAL(pos)] value2
FROM `project.dataset.table`,
UNNEST(GENERATE_ARRAY(1, ARRAY_LENGTH(SPLIT(col1, '|')))) pos
预期结果
Row id value1 value2
1 1 a n
2 1 b o
3 1 c p
4 2 d q
5 2 e r
6 3 f s
7 3 g t
8 3 h u
9 3 i v
10 4 j w
11 5 k x
12 5 l y
13 5 m z
我有这样的数据:
每列在一行中将具有相同数量的元素,其中第一列中的第一个元素对应于第二列中的第一个元素,依此类推。
我怎样才能将其展平以获得下面的内容?
对于单个列,我可以通过将 CROSS JOIN
与 UNNEST
组合来实现此目的,但我无法将其用于多个列,因为连接最终会创建多个变体并且 UNNEST
丢失了数组的顺序所以我无法匹配它们。
如果我从头开始构建数组,我会在其中使用某种 STRUCT
元素,但是当数组是从 [=15 创建的时,我找不到这样做的方法=]?
WITH_OFFSET
是你的朋友:
WITH strings AS (
SELECT "a,b,c" a, "aa,bb,cc" b
UNION ALL
SELECT "a1,b1,c1" a, "aa1,bb1,cc1" b
)
SELECT x_a, x_b
FROM strings
, UNNEST(SPLIT(a)) x_a WITH OFFSET o_a
JOIN UNNEST(SPLIT(b)) x_b WITH OFFSET o_b
ON o_a=o_b
BigQuery Standard SQL 的另一种方法如下所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 'a|b|c' col1, 'n|o|p' col2 UNION ALL
SELECT 2, 'd|e', 'q|r' UNION ALL
SELECT 3, 'f|g|h|i', 's|t|u|v' UNION ALL
SELECT 4, 'j', 'w' UNION ALL
SELECT 5, 'k|l|m', 'x|y|z'
)
SELECT
id,
SPLIT(col1, '|')[SAFE_ORDINAL(pos)] value1,
SPLIT(col2, '|')[SAFE_ORDINAL(pos)] value2
FROM `project.dataset.table`,
UNNEST(GENERATE_ARRAY(1, ARRAY_LENGTH(SPLIT(col1, '|')))) pos
预期结果
Row id value1 value2
1 1 a n
2 1 b o
3 1 c p
4 2 d q
5 2 e r
6 3 f s
7 3 g t
8 3 h u
9 3 i v
10 4 j w
11 5 k x
12 5 l y
13 5 m z