繁体   English   中英

Postgres 如何对键/值 json 中的所有值求和(聚合)?

[英]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-
  • aggregate function json_agg将所有对象收集到一个JSONB数组中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM