计算 JSONB 键数组的加权平均值
Calculating Weighted Average of JSONB Array of Keys
在我的一张表中,我有以下结构,
ID LOG
1 [{"x":12,"W":1}, {"x":24,"W":2}]
2 [{"x":14,"W":1.02}, {"x":20,"W":2.2}, {"x":11,"W":1.022}, {"x":45,"W":62.2}]
我在应用程序端计算 x 的加权平均值,我想创建一个名为 weighted_avg_x
的生成列,每次将数据附加到 LOG
列时都会更新该列。两个问题可以使用生成的列来完成我也有点迷失了 jsonb 符号来计算 sum(x*w)/sum(w)
?
您需要一个可用于定义生成列的不可变函数:
create or replace function get_weighted_avg_x(log jsonb)
returns numeric language sql immutable as
$$
select sum((elem->'x')::numeric* (elem->'W')::numeric) / sum((elem->'W')::numeric)
from jsonb_array_elements(log) as arr(elem)
$$;
alter table my_table add column weighted_avg_x numeric
generated always as (get_weighted_avg_x(log)) stored;
解决方案在 Postgres 12+ 中是可行的。在早期版本中,您需要定义一个触发器。
中测试
在我的一张表中,我有以下结构,
ID LOG
1 [{"x":12,"W":1}, {"x":24,"W":2}]
2 [{"x":14,"W":1.02}, {"x":20,"W":2.2}, {"x":11,"W":1.022}, {"x":45,"W":62.2}]
我在应用程序端计算 x 的加权平均值,我想创建一个名为 weighted_avg_x
的生成列,每次将数据附加到 LOG
列时都会更新该列。两个问题可以使用生成的列来完成我也有点迷失了 jsonb 符号来计算 sum(x*w)/sum(w)
?
您需要一个可用于定义生成列的不可变函数:
create or replace function get_weighted_avg_x(log jsonb)
returns numeric language sql immutable as
$$
select sum((elem->'x')::numeric* (elem->'W')::numeric) / sum((elem->'W')::numeric)
from jsonb_array_elements(log) as arr(elem)
$$;
alter table my_table add column weighted_avg_x numeric
generated always as (get_weighted_avg_x(log)) stored;
解决方案在 Postgres 12+ 中是可行的。在早期版本中,您需要定义一个触发器。
中测试