Определение новой агрегатной функции в базе данных.
Синтаксис
CREATE AGGREGATE имя ( BASETYPE = входной_тип
[ , SFUNC = функция. STYPE = переходный_тип ]
[ , FINALFUNC = завершающая_функция ]
[ , INITCOND = начальное_состояние ] )
Параметры
Результаты
Описание
Команда CREATE AGGREGATE предназначена для определения новых агрегатных функций в PostgreSQL Самые распространенные агрегатные функции (min(), avg(), max() и т. д.) принадлежат к числу стандартных функций PostgreSQL. За дополнительной информацией о стандартных функциях PostgreSQL обращайтесь к главе 5.
Агрегатные функции характеризуются в первую очередь типом входных данных. Допускается существование двух и более агрегатных функций с одинаковыми именами, вызываемых с разными типами данных (это называется перегрузкой функций).
ВНИМАНИЕ
Во избежание недоразумений не пытайтесь создавать обычные функции с такими же именами и типами входных данных, что и у агрегатных функций. При возникновении конфликта агрегатные функции обладают более высоким приоритетом.
Агрегатная функция состоит из одной или двух обычных функций: обязательной переходной функции (функция) и необязательной завершающей функции (завершающая _функция).
PostgreSQL использует временную переменную типа переходный_тип, которая обновляется переходной функцией для каждой входной записи. Если в команде CREATE AGGREGATE определена завершающая функция, то после обработки всех данных она будет вызвана для вычисления окончательного результата. В противном случае возвращается итоговое значение переходной переменной без дополнительной обработки.
Команда CREATE AGGREGATE также может задать исходное состояние внутренней переходной переменной; для этой цели используется ключевое слово INITCOND. PostgreSQL хранит это значение в базе данных в виде типа text, однако оно должно представлять константу переходного типа, заданного с ключевым словом STYPE. Если параметр не задан, он инициализируется псевдозначением NULL.
Если переходная функция была создана с атрибутом isstrict (см. описание команды CREATE FUNCTION), она не может вызываться с параметром NULL. Если переходная функция объявлена подобным образом, выполнение агрегатной функции отличается от обычного — все входные параметры NULL игнорируются, и функция для них не вызывается. При этом сохраняется предыдущее переходное значение, а агрегатная функция продолжает обработку входных данных.
Кроме того, если промежуточная переменная была инициализирована псевдозначением NULL, она заменяется первым входным значением, отличным от NULL, а переходная функция вызывается для второго входного значения, отличного от NULL. Эта особенность может пригодиться для создания агрегатных функций, аналогичных функции max(). Обратите внимание: это происходит только в том случае, если входпой_тип и переходный_гпип совпадают. Если типы различаются, вы должны либо передать начальное значение, отличное от NULL, либо использовать переходную функцию без атрибута isstrict.
Если переходная функция не объявлена с атрибутом isstrict, она вызывается для каждого входного значения без исключений. При этом у программиста появляется возможность самостоятельно организовать обработку псевдозначеннй NULL во входных данных.
Если завершающая функция объявлена с атрибутом isstrict, она не будет вызываться в том случае, если итоговое переходное состояние равно NULL; вместо этого автоматически выводится результат NULL.