![](/img/trans.png)
[英]How to aggregate the sum of a field to a string_Aggregated value Postgres
[英]Postgres how to sum (aggregate) all the values in a key/value json?
我的查询在这里:
select datetime,array_to_json(array_agg(json_build_object('parameter',parameter,'channel_id',channel_id,'value',value,'status',status,'units',units))) as parameters
from dbp_istasyondata
where site_id=10
and channel_id IN (0,1,2,3,4)
and datetime between '2022-12-01T00:00:00' and '2022-12-01T01:30:00'
group by 1
order by 1;
这就是它作为对该查询的响应而出现的方式:
"datetime" "parameters"
"2022-12-01 00:00:00" "[{""channel_id"" : 0, ""value"" : 7.72},{""channel_id"" : 1, ""value"" : 1593.87}]"
"2022-12-01 00:01:00" "[{""channel_id"" : 1, ""value"" : 1612.26},{""channel_id"" : 0, ""value"" : 7.72}]"
"2022-12-01 00:02:00" "[{""channel_id"" : 0, ""value"" : 7.72},{""channel_id"" : 1, ""value"" : 1615.36}]"
"2022-12-01 00:03:00" "[{""channel_id"" : 0, ""value"" : 7.72},{""channel_id"" : 1, ""value"" : 1625.99}]"
"2022-12-01 00:04:00" "[{""channel_id"" : 0, ""value"" : 7.71},{""channel_id"" : 1, ""value"" : 1623.12}]"
"2022-12-01 00:05:00" "[{""channel_id"" : 0, ""value"" : 7.72},{""channel_id"" : 1, ""value"" : 1638.58}]"
"2022-12-01 01:00:00" "[{""channel_id"" : 0, ""value"" : 7.74},{""channel_id"" : 1, ""value"" : 1647.09}]"
"2022-12-01 01:01:00" "[{""channel_id"" : 0, ""value"" : 7.74},{""channel_id"" : 1, ""value"" : 1656.71}]"
"2022-12-01 01:02:00" "[{""channel_id"" : 1, ""value"" : 1646.86},{""channel_id"" : 0, ""value"" : 7.74}]"
"2022-12-01 01:03:00" "[{""channel_id"" : 1, ""value"" : 1656.34},{""channel_id"" : 0, ""value"" : 7.74}]"
"2022-12-01 01:04:00" "[{""channel_id"" : 1, ""value"" : 1652.63},{""channel_id"" : 0, ""value"" : 7.74}]"
"2022-12-01 01:05:00" "[{""channel_id"" : 0, ""value"" : 7.74},{""channel_id"" : 1, ""value"" : 1648.01}]"
我想要的结果:
"datetime" "parameters"
"2022-12-01 00:00:00" "[{""channel_id"" : 0, ""value"" : 50},{""channel_id"" : 1, ""value"" : 1593.87}]"
"2022-12-01 01:00:00" "[{""channel_id"" : 1, ""value"" : 102348},{""channel_id"" : 0, ""value"" : 7.72}]"
我想要的结果只是按小时收集值并显示为 json。有办法吗?
作为我研究的结果,我找到了这样一个总和,但我无法得到它给我想要的答案。 你能帮助我吗?
select date_trunc('hour', datetime), SUM (value) as total
from dbp_istasyondata
where channel_id=3
and site_id=16
and datetime between '2022-11-01T00:00:00' and '2022-12-01T04:00:00'
group by 1;
据我了解你的问题,你想要一个每小时一行的结果集,以及一个包含 JSON 数组的列,该数组给出每个通道的值的总和。
您通常需要两个级别的聚合; 一个计算每小时和每个通道的聚合,然后另一个仅计算每小时的聚合。
select datehour, jsonb_agg( to_jsonb(t) - 'datehour') res
from (
select date_trunc('hour', datetime) datehour, channel_id, sum(value) value
from bp_istasyondata
where site_id = 10
and channel_id in (0, 1, 2, 3, 4)
and datetime between '2022-12-01T00:00:00' and '2022-12-01T01:30:00'
group by 1, 2
) t
group by 1
笔记:
date_trunc
将时间戳或日期截断到给定的精度to_jsonb(t)
将子查询返回的每个记录集转换为 JSONB object(我们使用 jsonb 运算符从中删除datehour
键-
)json_agg
将所有对象收集到一个JSONB数组中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.