我是postgres数组新手。
我需要修改C数组的前四个元素
公式是C[1:4] = A[1:4] + B[1:4]此计算是在group_name维度 上完成的。是否有一种优雅的方式来做到这一点,也许没有连接?
insert into the_table values
(1,'group 1', 'A', '{1,2,3,4,5}'),
(2,'group 1', 'B', '{10,20,30,40,50}'),
(3,'group 2', 'A', '{-1,-2,-3,-4,-5}'),
(4,'group 2', 'B', '{-10,-20,-30,-40,-50}'),
(5,'group 1', 'C', '{0,0,0,0,0}'),
(6,'group 2', 'C', '{0,0,0,0,0}');
输入数据:
<表类>id group_name var val tbody><<tr>1 组1 1, 2, 3, 4, 5 2组1 B 10、20、30、40、50 3 组1 C 0, 0, 0, 0, 0 4组2 1, 2, 3, 4, 5 5组2 td> -10, -20, -30, -40, -50 6组2 C 0, 0, 0, 0, 0 表类>
您需要一个在给定基础上对数组求和的函数。
create or replace function sum_arrays(arr int[])
returns int[] language sql immutable as $$
select array[
arr[1][1]+ arr[2][1],
arr[1][2]+ arr[2][2],
arr[1][3]+ arr[2][3],
arr[1][4]+ arr[2][4],
0]
$$;
使用这个函数,更新看起来相当优雅:
update the_table t
set val = sum_arrays
from (
select group_name, sum_arrays(array_agg(val))
from the_table
where var in ('A', 'B')
group by group_name
) s
where t.group_name = s.group_name
and t.var = 'C';
在db<>fiddle中测试。
Postgres中不支持对数组进行分段操作。您将无法绕过一些连接,这些连接会打开数组的嵌套,通过索引连接,然后将它们聚合回来:
UPDATE the_table tab_c
SET val = (
SELECT array_agg(a + b ORDER BY a_idx)
FROM the_table tab_a,
unnest(tab_a.val) WITH ORDINALITY AS val_a(a, a_idx),
the_table tab_b,
unnest(tab_b.val) WITH ORDINALITY AS val_b(b, b_idx)
WHERE tab_a.group_name = tab_c.group_name
AND tab_a.var = 'A'
AND tab_b.group_name = tab_c.group_name
AND tab_b.var = 'B'
AND a_idx = b_idx
)
WHERE tab_c.var = 'C';
TABLE the_table;
<一口>(在线演示)一口>