JSON 数据的 PostgreSQL 平均值

PostgreSQL average of JSON Data

我有一些这样的数据:

id      heart_rate
1       {0: 28, 1: 25, 2: 38, 3: 42}
2       {0: 30, 1: 28, 2: 43, 3: 58}
3       {0: 42, 1: 29, 2: 98, 3: 38}

我正在尝试 return 一个具有平均值的对象,如下所示:

{0: 32, 1: 26, 2: 58, 3: 43}

我试过脚本来循环和分析,但是考虑到数据量,一个循环可能会花费太长时间并且不实用。

您需要提取所有值,将它们转换为数字,计算平均值,然后将其转换回 JSON 值:

select to_jsonb(r)
from (
  select avg((heart_rate ->> '0')::int) as "0", 
         avg((heart_rate ->> '1')::int) as "1", 
         avg((heart_rate ->> '2')::int) as "2", 
         avg((heart_rate ->> '3')::int) as "3"
  from the_table
) r;

如果您并不真正了解这些键,但您知道 所有 键都可以转换为数字,您可以这样做:

select jsonb_object_agg(ky, average)
from (
  select r.ky, round(avg(r.val::int)) as average
  from the_table
    cross join jsonb_each(heart_rate) as r(ky, val)
  group by r.ky
) t;

Online example