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;
我有一些这样的数据:
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;