簡體   English   中英

存儲在 jsonb 中的數組的 Postgres 總和

[英]Postgres sum of array stored in jsonb

我有一個 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

會這樣做,但我被告知:錯誤:聚合函數調用不能包含設置返回函數調用提示:您可以將設置返回函數移動到 LATERAL FROM 項中。

我一直在研究 LATERAL FROM,但我仍然不明白 postgres 要我做什么......

如果我將持續時間和值存儲為數組而不是 json,這樣做會更容易嗎?

在橫向連接中使用該函數:

select start, sum(number::int)
from step s
cross join jsonb_array_elements_text(value) as number
group by start

         start          | sum 
------------------------+-----
 2019-01-04 19:00:00+01 |   6
 2019-01-04 19:46:00+01 |   7
 2019-01-04 18:44:00+01 |   9
 2019-01-04 19:19:00+01 |   9
 2019-01-04 18:34:00+01 |   7
 2019-01-04 19:06:00+01 |  17
 2019-01-04 19:49:00+01 |   0
 2019-01-04 19:41:00+01 |  30
(8 rows)

此交叉連接是橫向連接,該函數對step每一行執行一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM