【问题标题】:Splitting a string column in BigQuery在 BigQuery 中拆分字符串列
【发布时间】:2013-10-25 04:28: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 中完成吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

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


    看“find all two word phrases that appear in more than one row in a dataset”。

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

    【讨论】:

    • 很好 - 这太棒了!是否有任何参数可以指定从结果数组中提取的元素范围?
    • 我不确定我是否理解。发布新问题?见stackoverflow.com/a/24172995/132438
    • 是否可以将分数列拆分为多个列,即 score1、scores2、scores3 等?而不是为每个值创建一行?
    【解决方案2】:

    尝试在Standart SQL中重写Elad Ben Akoune's answer,查询变成这样;

    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    |
    +------+-------+
    

    【讨论】:

      【解决方案3】:

      如果有人还在寻找答案

      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)
      );
      

      【讨论】:

      • 注意:此查询仅适用于旧版 SQL 模式。在Standart SQL中,会报“Column name Name is ambiguous”的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多