Как написать агрегирующую функцию PostgreSQL
скул запрос
SELECT id_page, COUNT(id_page), SUM (weight) as weight FROM tb_search WHERE id_word=1 OR id_word=2 GROUP BY id_page ORDER BY count desc
а нужно например
SELECT id_page, COUNT(id_page), SUM (weight) as weight, FUNCT(weight) as funct FROM tb_search WHERE id_word=1 OR id_word=2 GROUP BY id_page ORDER BY count desc
проблема решена но не полностью
как я понял агрегирующие функции можно написать только на си
класс комплекс кажисть нашел метод комплекс_адд но умножения чета не нашел
http://www.postgresql.org/docs/8.3/interactive/sql-createaggregate.html
Оригинальный ответ :) но сути не обьясняет, может можно другим путем пойти ане через функции? нужен аналог SUM но только умножение, не придирайся
BASETYPE=numeric,
SFUNC=numeric_mul,
STYPE=numeric
);
вот так, вроде оно, сделатй легко, поставй себе PgAdmin из интегфейса create aggregate и там уже понятно будет :D
select multiply(x)
from
(
select 2 as x
union all
select 2
union all
select 2
)a
2*2*2 = 8
СПС xxxxx проверю, отпишусь
Спай не у всех есть время и возможно ум что бы осилить ман, уже вырос из возраста что бы меня тыкали в ман, если не понимаю - приведи пример
ЗЫ после холиваров с ту перешел на постгре пока не жалею, но толковых ответов при трабле фик найдешь
(с)Капитан очевидность
ЗЗЫ
SFUNC=numeric_mul,
откуда взялась эта строка?
все чего не хватало это numeric_mul, где в мане преведены все внутренние функции пг?
Ну раз ум есть только у меня и времени видимо у меня просто завались - лови пример. Только все это делается за 3 минуты после прочтения короткой статьи из мануала. RTFM!!!
Итак. Для тестирования используем такую таблицу:
num_field bigint
);
Наполняем ее данными. Я забил туда 10 записей со значениями поля num_field от 1 до 10.
Создаем функцию для перемножения двух чисел:
$_$
DECLARE
num1 ALIAS FOR $1;
num2 ALIAS FOR $2;
res bigint;
BEGIN
res=num1*num2;
RETURN res;
END
$_$
LANGUAGE plpgsql;
Теперь создаем аггрегирующую функцию:
(
SFUNC=multiplex,
STYPE=bigint,
INITCOND='1'
)
SFUNC - задает функцию которой будет передана внутренняя переменная состояния аггрегатора
STYPE - тип данных внутренней переменной состояния
INITCOND - необязательный параметр начального значения внутренней переменной состояния. В нашем случае (когда идет умножение) нужно его выставить в 1, иначе кроме NULL или 0 мы ничего не получим.
Теперь можно использовать нашу новую функцию аггрегирования:
Результат: 120
Результат: 48