CREATE AGGREGATE name [ AS ] ( BASETYPE = data_type [ , SFUNC1 = sfunc1, STYPE1 = sfunc1_return_type ] [ , SFUNC2 = sfunc2, STYPE2 = sfunc2_return_type ] [ , FINALFUNC = ffunc ] [ , INITCOND1 = initial_condition1 ] [ , INITCOND2 = initial_condition2 ] )
El nombre de la función de agregado a crear.
El tipo de dato fundamental sobre el que opera esta función de agregado.
La función de estado de trancisión que ha de llamarse para cada campo no nulo desde la columna fuente. Toma una variable del tipo sfunc1_return_type como primer argumento y el campo como segundo argumento.
El tipo devuelto de la primera función de trancisión.
La función de estado de trancisión que ha de llamarse para cada campo no nulo de la columna origen. Toma una variable de tipo sfunc2_return_type como argumento unico y devuelve una variable del mismo tipo.
EL tipo devuelto por la segunda función de trancisión.
La función final llamada tras convertir todos los campos de entrada. Esta función debe recibir dos argumentos de los tipos sfunc1_return_type y sfunc2_return_type.
El valor inicial para el argumento de la primera función de trancisión.
El valor inicial del argumento de la segunda función de trancisión.
CREATE AGGREGATE permite a un usuario o programador extender la funcionalidad de Postgres definiendo nuevas funciones de agregado. Algunas funciones de agregado para tipos base como min(int4) y avg(float8) están ya disponibles en la distribución base. Si se definen nuevos tipos o se necesita una función de agregado que no se proporciona, puede usarse el comando CREATE AGGREGATE para proporcionar las características deseadas.
Una función de agregados puede requerir hasta tres funciones, dos funciones de trancisión de estado, sfunc1 y sfunc2:
sfunc1( internal-state1, next-data_item ) ---> next-internal-state1 sfunc2( internal-state2 ) ---> next-internal-state2y una función final de cálculo, ffunc:
ffunc(internal-state1, internal-state2) ---> aggregate-value
Postgres crea hasta dos variables temporales (referidas aquí como temp1 y temp2) para mantener resultados intermadios usados como argumentos por las funciones de trancisión.
Estas funciones de trancisión han de tener las siguinetes propiedades:
Los argumentos de sfunc1 deben ser temp1 del tipo sfunc1_return_type y column_value de tipo data_type. El valor devuelto debe ser del tipo sfunc1_return_type y será usado como primer argumento en la proxima llamada a sfunc1.
El argumento y valor devuelto de sfunc2 ha de ser temp2 del tipo sfunc2_return_type.
Los argumento para la función de cálculo final ha de ser temp1 y temp2 y su valor devuelto debe ser un tipo base de Postgres (no necesariamente data_type que ha sido especificado por BASETYPE).
FINALFUNC debe ser especificado si y solo si ambas funciones de trancisión de estado son especificadas.
Una función de agregado puede requerir solo una o dos condiciones iniciales, una para cada función de trancisión. Estas se especifican y almacenan en la base de datos como campos de tipo text.
Use DROP AGGREGATE para desechar funciones de agregado.
Es posible especificar funciones de agregado que tengan diversas convinaciones de funciones de estado y funciones finales. Por ejemplo, la función de agregado count requiere SFUNC2 (una función de incremento) pero no SFUNC1 o FINALFUNC, mientras que la función de agregado sum requiere SFUNC1 (una función de adicción) pero no SFUNC2 ni FINALFUNC y la función de agregado avg requiere tanto las dos funciones de estado como una FINALFUNC (una función de división) para producir su resultado. En cualquier caso, al menos una de las funciones de estado debe ser definida, y cualquier SFUNC2 debe tener el correspondiente INITCOND2.
Vease el capítulo de las funciones de agregado en la Guia del Programador (PostgreSQL Programmer's Guide) para ejemplos de uso más completos.