【问题标题】:Postgres sum of array stored in jsonbPostgres 存储在 jsonb 中的数组的总和
【发布时间】: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


    【解决方案1】:

    在横向连接中使用该函数:

    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的每一行执行一次。

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 2016-08-10
      • 2019-03-21
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      相关资源
      最近更新 更多