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 ] ) |
nom de la fonction agrégat a créer.
le type de donnée fondamental sur lequel cette fonction agrégat opère.
la fonction transition appelée pour chaque champ non-NULL depuis la colonne source. Elle prend une variable de type sfunc1_return_type comme premier argument et le champ comme second argument.
type retourné de la première fonction transition.
la fonction transition appelée pour chaque champ non-NULL depuis la colonne source. Elle prend une variable de type sfunc2_return_type comme seul argument et retourne une variable du même type.
type retourné de la seconde fonction transition.
fonction finale appelée après avoir traversé tous les champs entrée. Cette fonction doit prendre deux arguments de type sfunc1_return_type et sfunc2_return_type.
valeur initiale pour le premier argument de fonction transition.
valeur initiale pour le second argument de fonction transition.
CREATE AGGREGATE permet à l'utilisateur ou au programmeur d'étendre les fonctionnalités de Postgres en définissant de nouvelles fonctions agrégats. Certaines fonctions agrégats de type base comme min(int4) et avg(float8) sont déja fournies dans la distribution de base. Si quelqu'un défini de nouveaux types ou a besoin d'une fonction agrégat pas encore fournie, CREATE AGGREGATE peut être utilisé pour fournir ces fonctionnalités.
Une fonction agrégat peut avoir besoin de trois fonctions, deux fonctions transition, sfunc1 et sfunc2:
sfunc1( internal-state1, next-data_item ) ---> next-internal-state1 sfunc2( internal-state2 ) ---> next-internal-state2 |
ffunc(internal-state1, internal-state2) ---> aggregate-value |
Postgres crée deux variables temporaires (voir temp1 et temp2) pour maintenir les résultats intermédiaires utilisés par les fonctions transition.
Ces fonctions transition nécessitent d'avoir les propriétés suivantes :
les arguments vers sfunc1 doivent être temp1 de type sfunc1_return_type et column_value de type data_type. la valeur de retour doit être de type sfunc1_return_type et devra être utilisée comme premier argument dans le prochain appel à sfunc1.
l'argument et la valeur de retour de sfunc2 doit être temp2 de type sfunc2_return_type.
les arguments vers la fonction calcul finale doivent être temp1 et temp2 et leurs valeurs de retour doivent être de type Postgres natif (pas nécessairement data_type qui a été spécifié pour BASETYPE).
FINALFUNC doit être spécifié si et seulement si les deux fonctions transition sont spécifiées.
Une fonction aggrégat peut aussi nécessiter une ou deux conditions initiales, une pour chaque fonction transition. Elles sont spécifiées et stockées dans la base comme champs de type text.
Utilisez DROP AGGREGATE pour supprimer les fonctions agrégats.
Il est possible de spécifier des fonctions agrégat pour avoir différentes combinaisons d'états et de fonctions finales. Par exemple, l'agrégat count requiert SFUNC2 (une fonction d'incrémentation) mais pas SFUNC1 ou FINALFUNC, de même l'agrégat sum requiert SFUNC1 (une fonction addition) mais pas SFUNC2 ou FINALFUNC et l'agrégat avg requiert les deux fonctions ci-dessus aussi bien que FINALFUNC (une fonction division) pour produire sa réponse. Dans certains cas, au moins une fonction doit être définie, et certaines SFUNC2 doivent avoir un INITCOND2 correspondant.
Voir le chapitre sur les agrégats dans le guide du programmeur PostgreSQL, pour des exemples complets sur les fonctions agrégats.