PostgreSQL按行聚合JSON记录集

时间:2017-08-22 01:40:36

标签: 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           b
-------------------------------------------------
1           4           4
2           14          8

更新

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

2 个答案:

答案 0 :(得分:2)

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

在这里,您可以测试查询或摆弄它http://rextester.com/ZTCY82930

有关json_to_recordset的文档,请参阅此https://www.postgresql.org/docs/9.6/static/functions-json.html

对于交叉联接,请参阅此https://www.reddit.com/r/PostgreSQL/comments/2u6ah3/how_to_use_json_to_recordset_on_json_stored_in_a/co6hr65/

修改正如您在更新中所说,您使用了jsonb字段,因此请使用json_to_recordset

而不是使用jsonb_to_recordset

答案 1 :(得分:1)

这是我第一次使用Postgres新的JSON功能,它们非常整洁!我使用名为Error in library.dynam(lib, package, package.lib) : DLL ‘ANN’ not found: maybe not installed for this architecture? 的表来解决这个问题。

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

我不得不做一个令人讨厌的双重演员test来获取JSON值作为整数,因为我可以从JSON直接转换为整数,就像我在this answer中发现的那样。

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

::text::integer

给出结果:

SELECT id,
    SUM(CASE WHEN k = 'a' THEN v ELSE 0 END) AS a,
    SUM(CASE WHEN k = 'b' THEN v ELSE 0 END) AS b
FROM (
    SELECT id, 
        (json_each(json_array_elements(data))).key as k, 
        (json_each(json_array_elements(data))).value::text::integer AS v FROM test
) AS json_data
GROUP BY id