arrays - PostgreSQL 聚合 json 数组

标签 arrays json postgresql aggregate-functions jsonb

我看到很多关于使用 json_array_elements 提取 JSON 数组元素的引用资料。但是,这似乎只适用于 1 个数组。如果我在一般查询中使用它,我会得到错误

ERROR: cannot call json_array_elements on a scalar

给定这样的东西:

<表类="s-表"> <头> 订单 <正文> { "order_id":"2", "items": [{"name": "apple","price": 1.10}]} { "order_id": "3","items": [{"name": "apple","price": 1.10},{"name": "banana","price": 0.99}]}

我要提取

<表类="s-表"> <头> 项目 计数 <正文> 苹果 2 香蕉 1

或者

<表类="s-表"> <头> 项目 total_value_sold <正文> 苹果 2.20 香蕉 0.99

是否可以使用 json_array_elements 像这样聚合 json 数组?

最佳答案

使用orders->'items' 的函数来展平数据:

select elem->>'name' as name, (elem->>'price')::numeric as price
from my_table
cross join jsonb_array_elements(orders->'items') as elem;

很容易从扁平化的数据中得到你想要的聚合:

select name, count(*), sum(price) as total_value_sold
from (
    select elem->>'name' as name, (elem->>'price')::numeric as price
    from my_table
    cross join jsonb_array_elements(orders->'items') as elem
    ) s
group by name;

Db<>fiddle.

关于arrays - PostgreSQL 聚合 json 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70795053/

相关文章:

c - 传递给 C 函数时丢失 char 数组的值

c - char** 是指向 C 中字符串数组的指针吗?

javascript - 给定一个表示层次结构的数组,在 JS 中将数据输出为树形

postgresql - Node.js Postgres 获取最后执行的查询

c - Strstr 返回 NULL

java - JSON提取作者守护API

json - 如何在 Liquid json 转换中使用 foreach 和追加字符串

javascript - 字符串化javascript函数

postgresql - Postgres 分层 (jsonb) CTE 不必要地慢

postgresql - 帮我解决这个 Postgresql 查询