Как реализовать пользовательскую агрегатную функцию?
Хочу создать свою пользовательскую агрегатную функцию, но что-то вообще не могу понять как это реализовать в SQL. Читал документацию, но все равно как-то не могу понять действий.
У меня сейчас вот такой запрос, где я суммирую умноженные числа:
select sum(Dprice*Price) from F
Но я хочу сделать свою агрегатную функцию, чтобы было так:
select agg(dpr,pri) from F
Как такое можно реализовать?
Ответы (1 шт):
CREATE FUNCTION my_own_aggregate_sfunc (numeric, numeric, numeric)
RETURNS numeric AS
$$
SELECT $1 + $2*$3;
$$ LANGUAGE 'sql' STRICT;
CREATE AGGREGATE my_own_aggregate(numeric, numeric)
(
INITCOND = 0.0,
STYPE = numeric,
SFUNC = my_own_aggregate_sfunc
);
select my_own_aggregate(dpr,pri) from F;
Собственно и всё. В базовом случае (а у вас как раз такой) у вас есть sfunc, которая принимает параметрами current state value и переданные агреггирующей функции параметры. Что-то с ними делает, выдаёт результат. Этот результат будет передан как current state value на следующем вызове с данными следующей строки - либо возвращён как результат всей агрегации.