【问题标题】:BigQuery: Converting key-value pairs in Array to columnsBigQuery:将数组中的键值对转换为列
【发布时间】:2020-11-02 03:31:43
【问题描述】:

我引用了这个post 并希望将event_params 字段中选定的键值对转换为列。我的桌子是这样的:

| user_id | event_params.key | event_params.value.string_value |
+---------+------------------+---------------------------------+
|  1      |               k1 |                             v11 |
|         +------------------+---------------------------------+
|         |               k2 |                             v12 |
|         +------------------+---------------------------------+
|         |               k3 |                             v13 |
+---------+------------------+---------------------------------+
|  1      |               k1 |                             v21 |
|         +------------------+---------------------------------+
|         |               k2 |                             v22 |
|         +------------------+---------------------------------+
|         |               k3 |                             v23 |
+---------+------------------+---------------------------------+
|  2      |               k1 |                             v31 |
|         +------------------+---------------------------------+
|         |               k2 |                             v32 |
|         +------------------+---------------------------------+
|         |               k3 |                             v33 |

每个大行在event_params 字段内有任意 N 行,并且每个大行可以重复,因为它可以由同一用户生成。我想保留这种重复。

我想要的最终结果:

| user_id |  k1 |  k3 |
+---------+-----+-----+
|       1 | v11 | v13 |
+---------+-----+-----+
|       1 | v21 | v23 |
+---------+-----+-----+
|       2 | v31 | v33 |

到目前为止我的查询:

SELECT 
  user_id, 
  IF(event_params.key = 'k1', event_params.value.string_value, NULL) AS k1,
  IF(event_params.key = 'k3', event_params.value.string_value, NULL) AS k3,
FROM `my-proj-id.analytics_xxxxx.events_20201030`
  , UNNEST(event_params) AS event_params
WHERE event_name='my-event-name'

为简洁起见,上表省略了event_name

我当前的实现导致NULL 出现在整个k3 列中,我认为这可能是由于UNNEST 造成的,并且没有一个未嵌套的行会同时包含k1 和k3。如何转换为上述我想要的最终结果?

注意:我想用标准 SQL 编写

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    select user_id,
      (select value.string_value from t.event_params where key = 'k1') as k1,
      (select value.string_value from t.event_params where key = 'k3') as k3  
    from `my-proj-id.analytics_xxxxx.events_20201030` t
    

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

    【讨论】:

      【解决方案2】:

      您可以在FROM 子句中使用LEFT JOINs 执行此操作:

      SELECT e.user_id, 
             event_k1.value.string_value AS k1,
             event_k3.value.string_value AS k3
      FROM `my-proj-id.analytics_xxxxx.events_20201030` e LEFT JOIN
           UNNEST(e.event_params) event_k1
           ON event_k1.key = 'k1' LEFT JOIN
           UNNEST(e.event_params) event_k3
           ON event_k3.key = 'k3'
      WHERE e.event_name = 'my-event-name';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-14
        • 1970-01-01
        相关资源
        最近更新 更多