Надеюсь, этот пример поможет.Вам нужна функция, которая принимает (аккумулятор, агрегатные аргументы) и возвращает новое значение аккумулятора.Поиграйте с приведенным ниже кодом, и вы должны почувствовать, как все это сочетается.
BEGIN;
CREATE FUNCTION sum_product_fn(int,int,int) RETURNS int AS $$
SELECT $1 + ($2 * $3);
$$ LANGUAGE SQL;
CREATE AGGREGATE sum_product(int, int) (
sfunc = sum_product_fn,
stype = int,
initcond = 0
);
SELECT
sum(i) AS one,
sum_product(i, 2) AS double,
sum_product(i,3) AS triple
FROM generate_series(1,3) i;
ROLLBACK;
Это должно дать вам что-то вроде:
one | double | triple
-----+--------+--------
6 | 12 | 18