23

假设我在 BigQuery 中有一个包含 2 列的表。第一列代表一个名称,第二列是一个定界值列表,长度任意。例子:

Name | Scores
-----+-------
Bob  |10;20;20
Sue  |14;12;19;90
Joe  |30;15

我想转换成第一个是名称的列,第二个是单个分值,如下所示:

Name,Score
Bob,10
Bob,20
Bob,20
Sue,14
Sue,12
Sue,19
Sue,90
Joe,30
Joe,15

这可以单独在 BigQuery 中完成吗?

4

3 回答 3

17

大家好消息!BigQuery 现在可以 SPLIT()!


查看“查找在数据集中出现在多于一行中的所有两个单词短语”。

目前没有在 BigQuery 中拆分()值以从字符串生成多行的方法,但您可以使用正则表达式来查找逗号并找到第一个值。然后运行类似的查询以查找第二个值,依此类推。它们都可以合并到一个查询中,使用上面示例中提供的模式(通过逗号进行联合)。

于 2013-10-16T23:48:36.543 回答
15

试图用标准 SQL 重写Elad Ben Akoune 的答案,查询变成了这样;

WITH name_score AS (
SELECT Name, split(Scores,';') AS Score
FROM (
      (SELECT * FROM (SELECT 'Bob' AS Name ,'10;20;20' AS Scores)) 
      UNION ALL 
      (SELECT * FROM (SELECT 'Sue' AS Name ,'14;12;19;90' AS Scores))
      UNION ALL
      (SELECT * FROM (SELECT 'Joe' AS Name ,'30;15' AS Scores))
)) 
SELECT name, score
FROM name_score
CROSS JOIN UNNEST(name_score.score) AS score;

这个输出;

+------+-------+
| name | score |
+------+-------+
| Bob  | 10    |
| Bob  | 20    |
| Bob  | 20    |
| Sue  | 14    |
| Sue  | 12    |
| Sue  | 19    |
| Sue  | 90    |
| Joe  | 30    |
| Joe  | 15    |
+------+-------+
于 2018-11-22T08:25:10.757 回答
12

如果有人还在寻找答案

select Name,split(Scores,';') as Score
from (
      # replace the inner custome select with your source table
      select *
      from 
      (select 'Bob' as Name ,'10;20;20' as Scores),
      (select 'Sue' as Name ,'14;12;19;90' as Scores),
      (select 'Joe' as Name ,'30;15' as Scores)
);
于 2015-05-21T08:46:12.857 回答