【问题标题】:Big Query (SQL) convert multiple columns to rows / arrayBig Query (SQL) 将多列转换为行/数组
【发布时间】:2021-04-20 13:31:04
【问题描述】:

我有一个包含多个类似列的数据源,看起来像这样,每个问题都是一个新列和相应的响应: Original

并且我想将它转换为使用具有两个配对列的数组,以便它最终看起来像这样,只有两列,问题和响应,并且每个旧列只有它自己的键 (1 ,2,3 等): Desired

请多多包涵,我相信这很简单,我认为需要使用 array_agg 甚至可能是 unpivot,但我已经浏览过过去的帖子,找不到任何具有类似解决方案的价值与来自“平面”源的多个列的名称相关的问题列/根据原始列名称在新字段中分配值。

我有这个,但我需要得到问题/响应配对......

select ID, array_agg(response ignore nulls) Questionnaire
from datasourcename,
unnest([Q1Response, Q2Response, ]) response
group by ID

非常感谢任何支持(第一次发帖!)

【问题讨论】:

    标签: sql google-bigquery unnest array-agg


    【解决方案1】:

    试试这个:

    with mytable as (
      select 1 as id, 'a' as q1response, 'c' as q2response, 'a' as q3response, 'd' as q4response union all
      select 2, 'b', 'a', 'a', 'd' union all
      select 3, 'a', 'b', 'b', 'a'
    )
    select
      id,
      [ struct('1' as question, q1response as response),
        struct('2' as question, q2response as response),
        struct('3' as question, q3response as response),
        struct('4' as question, q4response as response)
      ] as q
    from mytable
    

    【讨论】:

    • 来自列名?像“Q1Response”应该翻译成“1”吗?
    【解决方案2】:

    考虑以下解决方案 - 它适用于表中任意数量的问题/列,无需更改任何代码

    select id,
      array(
        select as struct regexp_extract(kv[offset(0)], r'\d+') as Question, 
          kv[offset(1)] as Response
        from unnest(regexp_extract_all(to_json_string(t), r',("[^"]+":"[^"]*")')) kvs, 
        unnest([struct(split(trim(kvs, '"'), '":"') as kv)])
      ) Questionnaire
    from `project.dataset.table` t     
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多