两个数组子集的和



我是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}');

输入数据:

<表类>idgroup_namevarvaltbody><<tr>1组11, 2, 3, 4, 52组1B10、20、30、40、503组1C0, 0, 0, 0, 04组21, 2, 3, 4, 55组2 td>-10, -20, -30, -40, -506组2C0, 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;

<一口>(在线演示)

相关内容

  • 没有找到相关文章

最新更新