PostgreSQL按行聚合JSON记录集键

PostgreSQL按行聚合JSON记录集键,sql,json,postgresql,postgresql-9.6,Sql,Json,Postgresql,Postgresql 9.6,我将PostgreSQL表中每一行的数据存储在JSON数组中,如下所示: id data ------------------------------------------------- 1 [{"a": 1, "b": 2}, {"a": 3, "b":2}] 2 [{"a": 5, "b": 8}, {"a": 9, "b":0}] 如何获得按id分组的记录集中特定键的总和? 以下是所需结果集的示例: id a

我将PostgreSQL表中每一行的数据存储在JSON数组中,如下所示:

id          data
-------------------------------------------------
1           [{"a": 1, "b": 2}, {"a": 3, "b":2}]
2           [{"a": 5, "b": 8}, {"a": 9, "b":0}]
如何获得按id分组的记录集中特定键的总和? 以下是所需结果集的示例:

id          a           b
-------------------------------------------------
1           4           4
2           14          8
更新:


我还应该提到数据列是jsonb数据类型。

这是我第一次使用Postgres新的JSON函数,它们非常整洁!我使用一个名为
test
的表得到了这个解决方案

我将数组元素拆分,然后将它们展开为键/值对,然后在外部查询中求和

我不得不进行一次令人讨厌的双重转换
::text::integer
,以将JSON值转换为整数,因为我在中发现,无法将JSON值直接转换为整数

我发现了如何分解键/值元组

给出结果:

id | a  | b
-----------
1  | 4  | 4
2  | 14 | 8
在这里,您可以测试查询或修改查询

有关json_to_记录集的文档,请参见

关于交叉连接的事情,请看这个

Edit:正如您在更新中所说,您使用了一个jsonb字段,因此不使用
json\u to\u记录集
,只需使用
jsonb\u to\u记录集

id | a  | b
-----------
1  | 4  | 4
2  | 14 | 8
select id, sum(a), sum(b)
  from jsontable j
    CROSS JOIN LATERAL
    json_to_recordset(j.data) as x(a integer, b integer)
group by id