Мне нужна функция postgresql, которая объединяет и суммирует (по ключу) 4 массива объектов jsonb. Каждый jsonb может иметь 0 или несколько объектов:
parameter 1: [ {"a": 1.0}, {"b": 2.5} ]
parameter 2: [ {"a": 1.0} ]
parameter 3: [ {"a": 1.0}, {"c": 2.5} ]
parameter 4: [ {"a": 1.0}, {"b": 2.5} ]
, и ожидается следующий результат:
[{"a": 4.0}, {"b": 5}, {"c": 2.5}]
У меня есть функция, которая действительно это делает. Но производительность у него очень плохая. Мне нужно вызывать его для каждой строки. На данный момент с 1,4 миллионами строк разница при добавлении вызова функции составляет от 39 se c до 2 min 30 se c. мы ожидаем получить более 50 миллионов результатов, и это будет примерно 1 час 40 минут.
Я действительно новичок в postgresql, и это лучшая функция, которую я могу сделать. Я не знаю, есть ли более эффективный способ сделать это.
это моя настоящая функция
create or replace function join_and_sum(parameter1 jsonb, parameter2 jsonb, parameter3 jsonb, parameter4 jsonb) returns jsonb
language plpgsql
as
$$
DECLARE
column_jsonb jsonb;
BEGIN
select into column_jsonb jsonb_agg(p.jsonb_build_object)
from (
SELECT jsonb_build_object(key, SUM(value::float))
FROM (
SELECT (JSONB_EACH_TEXT(j)).*
from jsonb_array_elements( parameter1 || parameter2 || parameter3 || parameter4) j
) j
group by j.key
) p;
RETURN column_jsonb;
END;
$$;
заранее спасибо