在PostgreSQL中的Json行中总结一个值

时间:2015-07-12 09:41:35

标签: json postgresql aggregate-functions

假设我在PostgreSQL中有一个包含两列Id和Doc的表。 在Doc列中,Json对象如下所示:

{"eid":{"a":5, "b":6, "c":9}, "time":12345}
{"eid":{"b":6, "c":9, "x":25}, "time":13255}

我很感激帮助我编写一个查询,根据指定的时间总结'a'eids。 感谢

2 个答案:

答案 0 :(得分:2)

我不确定你的意思"根据指定的时间",但我认为你想要:

SELECT * FROM j;
┌───────────────────────────────────────────────────┐
│                        doc                        │
├───────────────────────────────────────────────────┤
│ {"eid": {"a": 5, "b": 6, "c": 9}, "time": 12345}  │
│ {"eid": {"b": 6, "c": 9, "x": 25}, "time": 13255} │
└───────────────────────────────────────────────────┘
(2 rows)

SELECT SUM((doc#>>'{eid,a}')::integer) 
FROM j 
WHERE (doc->>'time')::integer = 12345;
┌─────┐
│ sum │
├─────┤
│   5 │
└─────┘
(1 row)

编辑

要一次获取所有密钥(根据您的架构,您可能需要将jsonb_*更改为json_*

SELECT key, SUM(jsonb_extract_path_text(doc, 'eid', key)::integer)
FROM j, jsonb_object_keys(doc->'eid') sub(key)
GROUP BY key
;
┌─────┬─────┐
│ key │ sum │
├─────┼─────┤
│ x   │  25 │
│ b   │  12 │
│ a   │   5 │
│ c   │  18 │
└─────┴─────┘
(4 rows)

答案 1 :(得分:1)

要对给定eid的数组time的所有值求和,请使用此查询:

select time, sum(value)
from (
    select
        (json_each(doc->'eid')).value::text::int,
        doc->>'time' as time
    from events 
    ) alias
group by 1
order by 1