在我的一張表中,我有以下結構,
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)?
uj5u.com熱心網友回復:
您需要一個可用于定義生成列的不可變函式:
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 中是可能的。在早期版本中,您需要定義觸發器。
在db<>fiddle中測驗它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460583.html
標籤:json 数据库 PostgreSQL jsonb
下一篇:帶有資料框位置的JSON
