我有下表-

ID , DATA
1   [{"key":"Apple", "value":2}, {"key":"Orange", "value":3}]
2   [{"key":"Apple", "value":5}, {"key":"Orange", "value":4}, {"key":"Cookie", "value":4}]

我想建立下表:

Id, Apple, Orange, Cookie
1   2      3     
2   5      4      4

我try 了parse_json和flatten的多种组合,但似乎都不支持这种 struct .

推荐答案

样本数据:

CREATE OR REPLACE TABLE tab
AS
SELECT 1 ID, PARSE_JSON('[{"key":"Apple", "value":2}, {"key":"Orange", "value":3}]') AS DATA
UNION 
SELECT 2, PARSE_JSON('[{"key":"Apple", "value":5}, {"key":"Orange", "value":4}, {"key":"Cookie", "value":4}]');

步骤1-解析:

SELECT id, s.VALUE:key::TEXT AS key, s.VALUE:value::TEXT AS value
FROM tab
,LATERAL FLATTEN(input=>tab.DATA) s;

输出:

enter image description here

第2步:枢轴

WITH cte AS (
    SELECT id, s.VALUE:key::TEXT AS key, s.VALUE:value::TEXT AS value
    FROM tab
    ,LATERAL FLATTEN(input=>tab.DATA) s
)
SELECT *
FROM cte
PIVOT(MAX(value) FOR KEY IN ('Apple', 'Orange', 'Cookie')) AS p;

输出:

enter image description here

Sql相关问答推荐

如何并行SELECT和RESET?

SQL查询以条件空值跟踪生产操作结果进展

Access 365将文本转换回BigInt

获得第三名或最老的记录

正在编写查询.我需要将订阅的时间段分为第一个订阅中包含的另一个订阅之前和之后的时间段

重用传递给 node 的参数-postgres upsert查询

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

如何使用Clickhouse的COUNT聚合返回所有列,但GROUP BY是这些列的子集

计算不同模式的时间跨度

计算组内多个日期间隔go 年的累计天数

如何使用 join 和 where 子句从另一表中仅删除一个表中的值

JSON对象查询SQL服务器

BigQuery数组是否包含NULL值的判断方法

SQL 多个不满足的条件失败

每组使用平均值来填补缺失值的SQL

查询以查找今天和昨天的数据之间的差异以及伪列

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

如何跨行合并以删除 SQL 中的空值?