用DuckDB将json字符串转换为表格的几种写法

第一个是我写的,用到了row_number()分析函数产生行号,但结果中有多余行号。数组维度还写了常数,不够灵活。
后两个是DuckDB技术讨论微信群的边齐先生写的。充分利用了列表函数,更好。

WITH raw AS (SELECT '{"headers":[],"rows":[["地区","韵达","邮政","丰网","极兔"],["安徽","4","2","6","2"],["浙江","7","2","2","8"],["上海","2","2","9","2"],["江苏","5","9","4","8"],["福建","9","10","4","7"],["广东","8","9","9","6"]]}'::JSON AS j
         )
         pivot(select u,rn,row_number()over(partition by rn) rn2 from(select unnest(b) u,row_number()over() rn from(select unnest(json_extract(j, '$.rows')::varchar[5][7])b from raw))) on rn2 using any_value(u) group by rn order by rn;

┌───────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│  rn   │    12345    │
│ int64 │ varcharvarcharvarcharvarcharvarchar │
├───────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│     1 │ 地区    │ 韵达    │ 邮政    │ 丰网    │ 极兔    │
│     2 │ 安徽    │ 4262       │
│     3 │ 浙江    │ 7228       │
│     4 │ 上海    │ 2292       │
│     5 │ 江苏    │ 5948       │
│     6 │ 福建    │ 91047       │
│     7 │ 广东    │ 8996       │
└───────┴─────────┴─────────┴─────────┴─────────┴─────────┘


WITH raw AS (SELECT '{"headers":[],"rows":[["地区","韵达","邮政","丰网","极兔"],["安徽","4","2","6","2"],["浙江","7","2","2","8"],["上海","2","2","9","2"],["江苏","5","9","4","8"],["福建","9","10","4","7"],["广东","8","9","9","6"]]}'::JSON AS j
         )    
, t as (
           select j.rows::varchar[][] as m from raw ),
        a as (select unnest(m[2:]) as r, m[1] as h from t),
        b as (select unnest(r[2:]) as, r[1] as 地区, unnest(h[2:]) as 快递 from a)
    pivot b on 快递 using first();
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│  地区   │  丰网   │  极兔   │  邮政   │  韵达   │
│ varcharvarcharvarcharvarcharvarchar │
├─────────┼─────────┼─────────┼─────────┼─────────┤
│ 福建    │ 47109       │
│ 浙江    │ 2827       │
│ 江苏    │ 4895       │
│ 安徽    │ 6224       │
│ 上海    │ 9222       │
│ 广东    │ 9698       │
└─────────┴─────────┴─────────┴─────────┴─────────┘ 

memory D WITH raw AS (SELECT '{"headers":[],"rows":[["地区","韵达","邮政","丰网","极兔"],["安徽","4","2","6","2"],["浙江","7","2","2","8"],["上海","2","2","9","2"],["江苏","5","9","4","8"],["福建","9","10","4","7"],["广东","8","9","9","6"]]}'::JSON AS j
                  )
         , t as (select unnest(j.rows::varchar[][]) as m from raw ),
         a as (select unnest(m) as v, m[1] as 地区, unnest(first(m) over()) kd from t)
         pivot (from a where kd<>'地区' and 地区<>'地区') on kd using first(v);
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│  地区   │  丰网   │  极兔   │  邮政   │  韵达   │
│ varcharvarcharvarcharvarcharvarchar │
├─────────┼─────────┼─────────┼─────────┼─────────┤
│ 上海    │ 9222       │
│ 广东    │ 9698       │
│ 安徽    │ 6224       │
│ 浙江    │ 2827       │
│ 江苏    │ 4895       │
│ 福建    │ 47109       │
└─────────┴─────────┴─────────┴─────────┴─────────┘ 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值