在PostgreSQL内的Json行中求和一个值

在PostgreSQL内的Json行中求和一个值,json,postgresql,aggregate-functions,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”EID进行汇总,我将不胜感激。 谢谢我不确定你说的“按规定时间”是什么意思,但我想你想要: SELECT * FROM j; ┌────────────────

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

{"eid":{"a":5, "b":6, "c":9}, "time":12345}
{"eid":{"b":6, "c":9, "x":25}, "time":13255}
如果能帮助我编写一个查询,根据指定的时间对“a”EID进行汇总,我将不胜感激。
谢谢

我不确定你说的“按规定时间”是什么意思,但我想你想要:

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 * 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 * 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 * 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.*
):


要对给定
时间的数组
eid
的所有值求和
,请使用以下查询:

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

要对给定
时间的数组
eid
的所有值求和
,请使用以下查询:

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

要对给定
时间的数组
eid
的所有值求和
,请使用以下查询:

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

要对给定
时间的数组
eid
的所有值求和
,请使用以下查询:

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

我能做的最接近的事情是:
从产生类似('a',5'的记录的事件中选择每个json(events.doc->'eid')。我能做的最接近的事情是:
从产生类似('a',5'的记录的事件中选择每个json(events.doc->'eid')。我能做的最接近的事情是:
选择每个json(events.doc->'eid')从产生类似('a',5'的记录的事件中。我能做的最近的事情是:
从产生类似('a',5'的记录的事件中选择每个(events.doc->'eid')。非常感谢@Marth,如果我想得到一个结果,即每个eid都是一行的(如,and),我该怎么办?@ehsantoghian:编辑了我的答案。但是,我不确定您打算如何在此查询中使用
time
值,因为您似乎希望一次获取所有
eid
s。感谢@Marth,当我希望将输出事件(eid)限制在一段时间内时,会使用该时间。例如,我想看上午9点到下午5点之间的活动。非常感谢@Marth,如果我想得到一个结果,即每个eid都是连续计算的(比如,和),我该怎么办?@ehsantoghian:编辑了我的答案。但是,我不确定您打算如何在此查询中使用
time
值,因为您似乎希望一次获取所有
eid
s。感谢@Marth,当我希望将输出事件(eid)限制在一段时间内时,会使用该时间。例如,我想看上午9点到下午5点之间的活动。非常感谢@Marth,如果我想得到一个结果,即每个eid都是连续计算的(比如,和),我该怎么办?@ehsantoghian:编辑了我的答案。但是,我不确定您打算如何在此查询中使用
time
值,因为您似乎希望一次获取所有
eid
s。感谢@Marth,当我希望将输出事件(eid)限制在一段时间内时,会使用该时间。例如,我想看上午9点到下午5点之间的活动。非常感谢@Marth,如果我想得到一个结果,即每个eid都是连续计算的(比如,和),我该怎么办?@ehsantoghian:编辑了我的答案。但是,我不确定您打算如何在此查询中使用
time
值,因为您似乎希望一次获取所有
eid
s。感谢@Marth,当我希望将输出事件(eid)限制在一段时间内时,会使用该时间。例如,我想看上午9点到下午5点之间的活动。