【问题标题】:Split function across multiple fields in BigQuery SQLBigQuery SQL 中跨多个字段的拆分函数
【发布时间】:2018-11-09 12:49:07
【问题描述】:

我有这样的数据:

每一列将在一行中具有相同数量的元素,其中第一列中的第一个元素对应于第二列中的第一个元素,依此类推。

如何将其展平以获得以下内容?

对于单个列,我可以通过将 CROSS JOINUNNEST 组合来做到这一点,但我无法让它与多个列一起使用,因为连接最终会创建多个变体并且 UNNEST 失去了顺序数组,所以我无法匹配它们。

如果我从头开始构建数组,我会在其中使用某种 STRUCT 元素,但是当数组是从 SPLIT() 创建时,我找不到这样做的方法?

【问题讨论】:

    标签: google-bigquery bigquery-standard-sql


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      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    
      

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 2016-07-25
        • 2016-08-24
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多