我有一张有几列字典的表格:payloadKV、metaKV等.

example table

我需要取消测试dict并旋转结果,将每个键放在一列中,并将值放在该行、列的对应单元格中.

+---------------------+-------+---------------+----------------+---------------------+-----+
|   ingestTimestamp   |  ...  | metadata.Area |  metadata.Cell | metadata.Department | ... |
+---------------------+-------+---------------+----------------+---------------------+-----+
| 2022-03-23 02:34:41 |   ... | MC            |           0010 |                0752 | ... |
| ...                 |   ... | ...           |            ... |                 ... | ... |
+---------------------+-------+---------------+----------------+---------------------+-----+

这些字典中的每一个都有任意数量的键/值,可能有数百个,而且我事先无法知道键名,所以我需要一些通用表达式来提取它们.

我已经看过一些例子,如何通过硬编码来提取所需的密钥,但我似乎找不到一种通用的方法.

推荐答案

使用BigQuery PIVOTEXECUTE IMMEDIATE可以相对容易地完成,如下例所示

create temp table temp as (
  select t.* except(payloadKV, metaKV), replace(key, '.', '_') key, value
  from your_table t, unnest(payloadKV)
  union all
  select t.* except(payloadKV, metaKV), replace(key, '.', '_') key, value
  from your_table t, unnest(metaKV)
);

execute immediate (select '''
  select * from temp pivot (any_value(value) for key in (''' || 
  (select string_agg("'" || key || "'", ',' order by key) from (select distinct key from temp))
  || '''))
''')           

如果应用于样本数据(类似于)你的问题

select '2022-03-23 02:34:41' ingestTimestamp, [
    struct('payload.Area' as key, 'MC1' as value), ('payload.Cell', '00101'), ('payload.Department', '07521')] payloadKV, [
    struct('metadata.Area' as key, 'MC' as value),('metadata.Cell', '0010'), ('metadata.Department', '0752')] metaKV
union all
select '2022-03-24 02:34:41' ingestTimestamp, [
    struct('payload.Area' as key, 'MC2' as value), ('payload.Cell', '00102'), ('payload.Department', '07522')] payloadKV, [
    struct('metadata.Area' as key, 'MC3' as value),('metadata.Cell', '00103'), ('metadata.Department', '07523')] metaKV

输出是

enter image description here

Sql相关问答推荐

Postgresql -如何计算刷卡和刷卡时间

从列的不同值创建列

有没有办法在每次计算每一行的数据时更新2个值?

使用占位符向SQL INSERT查询添加 case

将重复的值更新为下一个空闲数字

雅典娜嵌套Json提取液

在SQL查询中使用COALESS

返回找到的最小和最大row_number()spark SQL

数据库SQL-CTE命名空间(错误?)使用临时视图

如何使用不重复的单个顶级字段(列)向json数组 Select 多行

更正用于判断错误组合的SQL

group-by-clause具有特定列,而不是oracle的toad中的all

在同一列上迭代时计算持续时间

当 ansible 变量未定义或为空时,跳过 sql.j2 模板中的 DELETE FROM 查询

从输出中删除 jsonb_build_object

Postgres,使用 select 插入多个值

如何从一张表中获取值在至少三行相同的记录

标量子查询中的窗口函数不起作用

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

Set vs let vs 在snowflake中声明变量