Synopsis
CREATE AGGREGATE nom ( type_donnée_entrée [ , ... ] ) (
SFUNC = sfonc,
STYPE = type_donnée_état
[ , FINALFUNC = ffonc ]
[ , INITCOND = condition_initiale ]
[ , SORTOP = operateur_tri ]
)
ou l'ancienne syntaxe
CREATE AGGREGATE nom (
BASETYPE = type_base,
SFUNC = sfonc,
STYPE = type_donnée_état
[ , FINALFUNC = ffonc ]
[ , INITCOND = condition_initiale ]
[ , SORTOP = operateur_tri ]
)
Description
CREATE AGGREGATE
définit une nouvelle fonction d'agrégat. Quelques fonctions
d'agrégat basiques et largement utilisées sont fournies dans la
distribution standard ; elles sont documentées dans le Section 9.15,
« Fonctions d'agrégat ».
CREATE AGGREGATE
est utilisée
pour ajouter des fonctionnalités lors de la définition de nouveaux
types ou si une fonction d'agrégat n'est pas fournie.
Si un nom de schéma est donné (par exemple, CREATE AGGREGATE monschema.monagg ...), alors la
fonction d'agrégat est créée dans le schéma précisé. Sinon, elle
est créée dans le schéma courant.
Une fonction d'agrégat est identifiée par son nom et son (ou ses)
types de données en entrée. Deux agrégats dans le même schéma
peuvent avoir le même nom s'ils opèrent sur des types différents en
entrée. Le nom et le(s) type(s) de données en entrée d'un agrégat
doivent aussi être distincts du nom et du type de données de toutes
les fonctions ordinaires du même schéma.
Une fonction d'agrégat est réalisée à partir d'une ou deux
fonctions ordinaires : une fonction de transition d'état
sfonc
, et une fonction de traitement
final optionnelle
ffonc
.
Elles sont utilisées ainsi :
sfonc( état-interne, nouvelle-valeur-données ) ---> prochain-état-interne
ffonc( état-interne ) ---> valeur-agrégat
PostgreSQL™ crée une
variable temporaire de type
stype
pour contenir l'état interne
courant de l'agrégat. À chaque ligne en entrée, la valeur de
l'argument de l'agrégat est calculéeet la fonction de transition
d'état est appelé avec la valeur d'état courante et la valeur du
nouvel argument pour calculer une nouvelle valeur d'état interne.
Une fois que toutes les lignes sont traitées, la fonction finale
est appelée une seule fois pour calculer la valeur de retour de
l'agrégat. S'il n'existe pas de fonction finale, alors la valeur
d'état final est retournée en l'état.
Une fonction d'agrégat peut fournir une condition initiale,
c'est-à-dire une valeur initiale pour la valeur de l'état interne.
Elle est spécifiée et stockée en base comme une valeur de type
text mais doit être une représentation
externe valide d'une constante du type de donnée de la valeur
d'état. Si elle n'est pas fournie, la valeur d'état est
initialement positionnée à NULL.
Si la fonction de transition d'état est déclarée
« strict », alors elle ne peut
pas être appelée avec des entrées NULL. Avec une telle fonction de
transition, l'exécution d'agrégat se comporte comme suit. Les
lignes avec une valeur NULL en entrée sont ignorées (la fonction
n'est pas appelé et la valeur de l'état précédent est conservé). Si
la valeur de l'état initial est NULL, alors, à la première ligne
sans valeur NULL, la première valeur de l'argument remplace la
valeur de l'état, et la fonction de transition est appelée pour les
lignes suivantes avec toutes les valeurs non NULL en entrée. Cela
est pratique pour implémenter des agrégats comme max. Ce comportement n'est possible que quand
type_donnée_état
est
identique au premier
type_donnée_entrée
. Lorsque ces types
sont différents, une condition initiale non NULL doit être fournie,
ou une fonction de transition non stricte utilisée.
Si la fonction de transition d'état n'est pas stricte, alors elle
sera appelée sans condition pour chaque ligne en entrée et devra
gérer les entrées NULL et les valeurs de transition NULL. Cela
permet à l'auteur de l'agrégat d'avoir le contrôle complet sur la
gestion des valeurs NULL par l'agrégat.
Si la fonction finale est déclarée « strict », alors elle ne sera pas appelée quand
la valeur d'état finale est NULL ; à la place, un résultat NULL
sera retourné automatiquement. C'est le comportement normal de
fonctions strictes. Dans tous les cas, la fonction finale peut
retourner une valeur NULL. Par exemple, la fonction finale pour
avg renvoie NULL lorsqu'elle n'a aucune
lignes en entrée.
Les agrégats qui se comportent comme MIN
ou MAX peuvent parfois être optimisés en
cherchant un index au lieu de parcourir toutes les lignes en
entrée. Si un agrégat peut être optimisé, un opérateur de tri est spécifié. Dans ce cas, il est
nécessaire que l'agrégat fournisse le premier élément dans l'ordre
imposé par l'opérateur ; en d'autres mots
SELECT agg(col) FROM tab;
doit être équivalent à
SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;
On suppose également que l'agrégat ignore les entrées NULL et qu'il
fournit un résultat NULL si et seulement s'il n'y a aucune entrée
NULL. D'ordinaire, l'opérateur < d'un
type de données est le bon opérateur de tri pour MIN et > celui pour
MAX. L'optimisation ne prend jamais effet
sauf si l'opérateur spécifié est membre de la stratégie
« less than » (NdT : plus
petit que) ou « greater than »
(NdT : plus grand que) d'une classe d'opérateur pour un index
B-tree.