Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как написать агрегирующую функцию PostgreSQL

304
19 марта 2008 года
Fenyx
707 / / 26.01.2005
Кто знает как написать агрегирующую функцию типа SUM и возможно ли это языком plpgsql, функция нужна такая же как SUM только должна перемножать результаты, а не суммировать

скул запрос
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
304
24 марта 2008 года
Fenyx
707 / / 26.01.2005
а подниму ка я топ
проблема решена но не полностью
как я понял агрегирующие функции можно написать только на си
класс комплекс кажисть нашел метод комплекс_адд но умножения чета не нашел
13
25 марта 2008 года
RussianSpy
3.0K / / 04.07.2006
Мануал надо читать внимательнее

http://www.postgresql.org/docs/8.3/interactive/sql-createaggregate.html
304
25 марта 2008 года
Fenyx
707 / / 26.01.2005
Цитата: RussianSpy
Мануал надо читать внимательнее

http://www.postgresql.org/docs/8.3/interactive/sql-createaggregate.html


Оригинальный ответ :) но сути не обьясняет, может можно другим путем пойти ане через функции? нужен аналог SUM но только умножение, не придирайся

38K
28 марта 2008 года
xxxxx
1 / / 28.03.2008
CREATE AGGREGATE multiply(
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
13
28 марта 2008 года
RussianSpy
3.0K / / 04.07.2006
Собственно для для этого достаточно было прочитать одну страничку из мануала, на которую я дал ссылку. Однако автору топика хотелось чтобы функцию написали за него
304
29 марта 2008 года
Fenyx
707 / / 26.01.2005
Цитата: RussianSpy
Собственно для для этого достаточно было прочитать одну страничку из мануала, на которую я дал ссылку. Однако автору топика хотелось чтобы функцию написали за него


СПС xxxxx проверю, отпишусь
Спай не у всех есть время и возможно ум что бы осилить ман, уже вырос из возраста что бы меня тыкали в ман, если не понимаю - приведи пример
ЗЫ после холиваров с ту перешел на постгре пока не жалею, но толковых ответов при трабле фик найдешь
(с)Капитан очевидность

ЗЗЫ
SFUNC=numeric_mul,
откуда взялась эта строка?
все чего не хватало это numeric_mul, где в мане преведены все внутренние функции пг?

8
29 марта 2008 года
mfender
3.5K / / 15.06.2005
А не пойти-ли вам всем в БД (БиДе)? :D
13
29 марта 2008 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Fenyx
Спай не у всех есть время и возможно ум что бы осилить ман, уже вырос из возраста что бы меня тыкали в ман, если не понимаю - приведи пример



Ну раз ум есть только у меня и времени видимо у меня просто завались - лови пример. Только все это делается за 3 минуты после прочтения короткой статьи из мануала. RTFM!!!

Итак. Для тестирования используем такую таблицу:

 
Код:
CREATE TABLE table1 (
    num_field bigint
);


Наполняем ее данными. Я забил туда 10 записей со значениями поля num_field от 1 до 10.

Создаем функцию для перемножения двух чисел:

Код:
CREATE FUNCTION multiplex(bigint, bigint) RETURNS bigint AS
$_$

DECLARE
num1 ALIAS FOR  $1;
num2 ALIAS FOR $2;
res  bigint;

BEGIN
res=num1*num2;
RETURN res;
END

$_$
LANGUAGE plpgsql;


Теперь создаем аггрегирующую функцию:

 
Код:
CREATE AGGREGATE mul (bigint)
(
SFUNC=multiplex,
STYPE=bigint,
INITCOND='1'
)


SFUNC - задает функцию которой будет передана внутренняя переменная состояния аггрегатора

STYPE - тип данных внутренней переменной состояния

INITCOND - необязательный параметр начального значения внутренней переменной состояния. В нашем случае (когда идет умножение) нужно его выставить в 1, иначе кроме NULL или 0 мы ничего не получим.

Теперь можно использовать нашу новую функцию аггрегирования:

 
Код:
SELECT mul(num_field) FROM table1 WHERE num_field<=5

Результат: 120

 
Код:
SELECT mul(num_field) FROM table1 WHERE mod(num_field,2)=0 AND num_field<7

Результат: 48
304
29 марта 2008 года
Fenyx
707 / / 26.01.2005
СПС прояснилась логика
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог