sql - BigQuery:将数组中的键值对转换为列
问题描述
我引用了这篇文章,并希望将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 |
每个大行在字段内有任意 N 行,event_params
并且每个大行可以重复,因为它可以由同一用户生成。我想保留这种重复。
我想要的最终结果:
| 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
了整个 column k3
,我认为这可能是由于UNNEST
没有一个未嵌套的行会同时包含 k1 和 k3 。如何转换为上面我想要的最终结果?
注意:我想用标准 SQL 编写
解决方案
推荐阅读
- bash - Bash - 不能使用命令'bc',因为 Bandizip 有同名的命令
- javascript - OAuth 登录在 FireFox 但 Chrome 中不起作用
- oracle - 如何从 apex.oracle.com 删除仅运行应用程序
- reactjs - «一个组件正在更改要控制的复选框类型的不受控制的输入。» Formik 复选框的警告
- mongodb - 来自 mongodb 的 solr 中的增量导入问题
- javascript - 如何增加 EsLint 内存以避免`JavaScript heap out of memory`?
- java - Visual Studio Code 在哪里缓存用于自动完成的 Java 依赖项信息?
- sql - 如何找到在所有商店出售的产品
- r - 如何在R中重构数据框
- django - 如何将 ImageString 转换为 Image Django Rest Framework?