【发布时间】:2019-08-07 14:21:07
【问题描述】:
我有一个 postgres 数据库,其中一些数据存储为 jsonb 数组:
id | start | duration | value
----+------------------------+--------------+------------
1 | 2019-01-04 18:34:00+01 | [60] | [7]
2 | 2019-01-04 18:44:00+01 | [60] | [9]
3 | 2019-01-04 19:00:00+01 | [60] | [6]
4 | 2019-01-04 19:06:00+01 | [60] | [17]
5 | 2019-01-04 19:19:00+01 | [60] | [9]
6 | 2019-01-04 19:41:00+01 | [60, 60, 60] | [13, 8, 9]
7 | 2019-01-04 19:46:00+01 | [60] | [7]
8 | 2019-01-04 19:49:00+01 | [60] | [0]
我想在“值”字段中获取数组中所有值的总和。
我可以使用 jsonb_array_elements 从数组中获取所有值:
=# select jsonb_array_elements(value),value from step limit 20;
jsonb_array_elements | value
----------------------+------------
7 | [7]
9 | [9]
6 | [6]
17 | [17]
9 | [9]
13 | [13, 8, 9]
8 | [13, 8, 9]
9 | [13, 8, 9]
7 | [7]
等等。所以我想
select sum(jsonb_array_elements(value)::integer),start from step group by start
会这样做,但有人告诉我: 错误:聚合函数调用不能包含集合返回函数调用 提示:您也许可以将 set-returning 函数移动到 LATERAL FROM 项中。
我一直在研究 LATERAL FROM,但我仍然没有真正理解 postgres 想要我做什么......
如果我将持续时间和值存储为数组而不是 json,这样做会更容易吗?
【问题讨论】:
标签: arrays json postgresql aggregate-functions jsonb