【问题标题】:Split a column based on a character in BigQuery根据 BigQuery 中的字符拆分列
【发布时间】:2018-09-27 15:29:50
【问题描述】:

我在 BigQuery 上有一个如下所示的表格

Name | Score
Tim  | 63 > 89 > 90
James| 67 > 44

我想将 Score 列拆分为 N 单独的列,其中 N 是整个表中的最大分数长度。我希望表格如下。

Name| Score_1 | Score_2 | Score_3
Tim | 63      | 89      | 90
James| 67     | 44      | 0 or NA

我尝试了Split 命令,但我最终为每个名称-分数组合创建了一个新行。

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    对于 BigQuery 标准 SQL

    以下是简单的情况,假设您事先知道预期的最大分数长度(下例中为 3)

    #standardSQL
    WITH `project.dataset.your_table` AS (
      SELECT 'Tim' name, '63 > 89 > 90' score UNION ALL
      SELECT 'James', '67 > 44' 
    )
    SELECT 
      name, 
      score[SAFE_OFFSET(0)] AS score_1,
      score[SAFE_OFFSET(1)] AS score_2,
      score[SAFE_OFFSET(2)] AS score_3
    FROM (
      SELECT name, SPLIT(score, ' > ') score
      FROM `project.dataset.your_table`
    )  
    

    结果

    Row name    score_1 score_2 score_3  
    1   Tim     63      89      90       
    2   James   67      44      null         
    

    当然,上述方法意味着-如果您有很多分数-例如 10 或 20 或更多-您将需要添加相应数量的额外行,如下所示

      score[SAFE_OFFSET(20)] AS score_21
    

    所以,从输出的角度来看,上面给出了你想要的东西

    同时,以下对我来说更有意义,并且在大多数实际情况下更好,最优化:

    #standardSQL
    WITH `project.dataset.your_table` AS (
      SELECT 'Tim' name, '63 > 89 > 90' score UNION ALL
      SELECT 'James', '67 > 44' 
    )
    SELECT name, score
    FROM `project.dataset.your_table`, UNNEST(SPLIT(score, ' > ')) score
    

    结果

    Row name    score    
    1   Tim     63   
    2   Tim     89   
    3   Tim     90   
    4   James   67   
    5   James   44   
    

    【讨论】:

    • 非常感谢!在发布此问题之前,我尝试了第二种方法,但我仍然想要一种方法来执行第一种方法。尽管我们需要对列进行硬编码,但这会有所帮助。
    • 有一种相对简单的方法可以实际编写另一个 sql 来为您完成此操作。尝试搜索我的旧答案 - 如果您找不到但仍想知道 - 发布新的具体问题,我会在有时间时回答:o)
    • 你的意思是为每个组合创建一行然后旋转它?
    • 是的。如果有很多列,这会很有帮助:o)
    • 太棒了。 :o) 很高兴你先搜索了 :o)
    猜你喜欢
    • 2013-10-25
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多