将基于分隔符的行拆分为新行 - SQL
Split delimiter based rows in to new rows - SQL
我有以下数据,我想通过分隔符将每一行拆分为新行。
示例数据:
**Row No. | Data**
1 | abc,pqr,lmn,omr
2 | aaa,bbb,ccc,ddd
输出应该是:
**Row No. | Data**
1 | abc
2 | pqr
3 | lmn
4 | omr
5 | aaa
6 | bbb
6 | ccc
6 | ddd
我有以下代码片段,但它只适用于第一行。
SELECT * EXCEPT(c) REPLACE(c AS col)
FROM `project.dataset.table`,
UNNEST(SPLIT(col)) c;
使用以下内容:
WITH myData AS (
select
id,
values
FROM
UNNEST([
STRUCT<id int, values string>(1, 'abc,pqr,lmn,omr'),
STRUCT<id int, values string>(2, 'aaa,bbb,ccc,ddd')
])
)
SELECT
id,
data
FROM myData,
UNNEST(SPLIT(values, ',')) AS data
ORDER BY id ASC
我首先使用您的测试数据创建一个临时示例 table。你正在寻找的要点在最后。您在正确的轨道上使用 UNNEST
将数组的元素分解为单独的行,但是您缺少 SPLIT
函数来实际通过逗号分隔字符串中的各个值分隔符。
此查询产生以下结果:
id
data
1
abc
1
pqr
1
lmn
1
omr
2
aaa
2
bbb
2
ccc
2
ddd
并且只是对此进行了调整 - 如果您只是想要一个单调递增的数字作为 ID,而不是像它在那里那样重复(例如,不需要 link 返回到 ID),请更新您的查询以下内容:
WITH myData AS (
select
id,
values
FROM
UNNEST([
STRUCT<id int, values string>(1, 'abc,pqr,lmn,omr'),
STRUCT<id int, values string>(2, 'aaa,bbb,ccc,ddd')
])
)
SELECT ROW_NUMBER() OVER() AS id,
data
FROM myData,
UNNEST(SPLIT(values, ',')) AS data
ORDER BY id ASC
在这里,我只是放弃了 SELECT 表达式中 id
字段的使用,并替换为递增的行号,该行号在数据集中的所有记录上递增。这会产生以下结果:
id
data
1
abc
2
pqr
3
lmn
4
omr
5
aaa
6
bbb
7
ccc
8
ddd
我有以下数据,我想通过分隔符将每一行拆分为新行。
示例数据:
**Row No. | Data**
1 | abc,pqr,lmn,omr
2 | aaa,bbb,ccc,ddd
输出应该是:
**Row No. | Data**
1 | abc
2 | pqr
3 | lmn
4 | omr
5 | aaa
6 | bbb
6 | ccc
6 | ddd
我有以下代码片段,但它只适用于第一行。
SELECT * EXCEPT(c) REPLACE(c AS col)
FROM `project.dataset.table`,
UNNEST(SPLIT(col)) c;
使用以下内容:
WITH myData AS (
select
id,
values
FROM
UNNEST([
STRUCT<id int, values string>(1, 'abc,pqr,lmn,omr'),
STRUCT<id int, values string>(2, 'aaa,bbb,ccc,ddd')
])
)
SELECT
id,
data
FROM myData,
UNNEST(SPLIT(values, ',')) AS data
ORDER BY id ASC
我首先使用您的测试数据创建一个临时示例 table。你正在寻找的要点在最后。您在正确的轨道上使用 UNNEST
将数组的元素分解为单独的行,但是您缺少 SPLIT
函数来实际通过逗号分隔字符串中的各个值分隔符。
此查询产生以下结果:
id | data |
---|---|
1 | abc |
1 | pqr |
1 | lmn |
1 | omr |
2 | aaa |
2 | bbb |
2 | ccc |
2 | ddd |
并且只是对此进行了调整 - 如果您只是想要一个单调递增的数字作为 ID,而不是像它在那里那样重复(例如,不需要 link 返回到 ID),请更新您的查询以下内容:
WITH myData AS (
select
id,
values
FROM
UNNEST([
STRUCT<id int, values string>(1, 'abc,pqr,lmn,omr'),
STRUCT<id int, values string>(2, 'aaa,bbb,ccc,ddd')
])
)
SELECT ROW_NUMBER() OVER() AS id,
data
FROM myData,
UNNEST(SPLIT(values, ',')) AS data
ORDER BY id ASC
在这里,我只是放弃了 SELECT 表达式中 id
字段的使用,并替换为递增的行号,该行号在数据集中的所有记录上递增。这会产生以下结果:
id | data |
---|---|
1 | abc |
2 | pqr |
3 | lmn |
4 | omr |
5 | aaa |
6 | bbb |
7 | ccc |
8 | ddd |