Les fonctions d'agrégat calculent un seul résultat à partir d'un ensemble de valeurs en entrée. Les fonctions d'agrégat natives à but général sont listées dans Tableau 9.58 alors que les agrégats statistiques sont dans Tableau 9.59. Les fonctions d'agrégat natives à ensemble trié dans des groupes sont listées dans Tableau 9.60 alors que les fonctions à ensemble hypothétique dans des groupes sont dans Tableau 9.61. Les opérations de regroupement, qui sont fortement liées aux fonctions d'agrégat, sont listées dans Tableau 9.62. Les considérations spéciales de syntaxe pour les fonctions d'agrégat sont expliquées dans Section 4.2.7. Consultez Section 2.7 pour une introduction supplémentaire.
Les fonctions d'agrégat qui supportent le Mode Partiel sont éligibles à participer à différentes optimisations, telles que l'agrégation parallélisée.
Tableau 9.58. Fonctions d'agrégat à but général
Fonction Description | Mode Partiel |
---|---|
RécupÚre toutes les valeurs en entrée, y compris les NULL, et les place dans un tableau. | No |
ConcatĂšne tous les tableaux en entrĂ©e dans un tableau d'une dimension supĂ©rieure. (Les entrĂ©es doivent toutes avoir la mĂȘme dimension, et ne peuvent ĂȘtre ni vides ni NULL.) | No |
Calcule la moyenne (arithmétique) de toutes les valeurs en entrée, non NULL. | Yes |
Calcule un AND bit à bit de toutes les valeurs en entrée non NULL. | Yes |
Calcule un OR bit à bit de toutes les valeurs en entrée non NULL. | Yes |
Calcule un OR exclusif bit Ă bit de toutes les valeurs en entrĂ©e non NULL. Peut ĂȘtre utile comme somme de contrĂŽle pour un ensemble de valeurs non ordonnĂ©es. | Yes |
Renvoie true si toutes les valeurs en entrée non NULL valent true, sinon false. | Yes |
Renvoie true si au moins une des valeurs en entrée non NULL vaut true, sinon false. | Yes |
Calcule le nombre de lignes en entrée. | Yes |
Calcule le nombre de lignes en entrée pour lesquelles la valeur n'est pas NULL. | Yes |
Ceci est l'équivalent de | Yes |
RécupÚre toutes les valeurs en entrée, y compris les NULL, et les place
dans un tableau JSON. Les valeurs sont converties en JSON avec
| No |
RécupÚre toutes les paires clé/valeur et les place dans un objet JSON.
Les arguments clé sont convertis en texte ; les arguments valeur
sont convertis avec | No |
Calcule la valeur maximale de toutes les valeurs en entrée non NULL.
Disponible pour les types numeric, string, date/time ou enum type,
ainsi que | Yes |
Calcule la valeur minimale de toutes les valeurs en entrée non NULL.
Disponible pour les types numeric, string, date/time ou enum type,
ainsi que | Yes |
Calcule l'union des valeurs non NULL en entrée. | No |
Calcule l'intersection des valeurs non NULL en entrée. | No |
ConcatÚne les valeurs en entrée non NULL dans une chaßne. Chaque valeur
aprÚs la premiÚre est précédée par le | No |
Calcule la somme de toutes les valeurs en entrée non NULL. | Yes |
ConcatÚne toutes les valeurs XML en entrée non NULL (voir Section 9.15.1.7). | No |
Il doit ĂȘtre notĂ© que, sauf pour count
, ces fonctions
renvoient NULL quand aucune ligne n'est sélectionnée. En particulier, le
sum
d'aucune ligne renvoie NULL, et non pas zéro comme
certains s'y attendraient, et array_agg
renvoie NULL
plutÎt qu'un tableau vide s'il n'y a pas de lignes en entrée. La fonction
coalesce
peut ĂȘtre utilisĂ©e pour substituer une valeur
NULL à zéro ou un tableau vide quand cela s'avÚre nécessaire.
Les fonctions d'agrégat array_agg
,
json_agg
, jsonb_agg
,
json_object_agg
, jsonb_object_agg
string_agg
et xmlagg
, ainsi que les
fonctions d'agrégat utilisateurs similaires, produisent des valeurs de résultat
différentes suivant l'ordre des valeurs en entrée. Cet ordre n'est pas spécifié
par dĂ©faut, mais peut ĂȘtre contrĂŽlĂ© en Ă©crivant une clause ORDER
BY
dans l'appel à l'agrégat, comme indiqué dans Section 4.2.7. Autrement, fournir les valeurs en entrée triées
Ă partir d'une sous-requĂȘte fonctionne gĂ©nĂ©ralement. Par exemple :
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Attention que cette approche peut Ă©chouer si le niveau de la requĂȘte externe contient un traitement supplĂ©mentaire, tel qu'une jointure, parce que cela pourrait remettre en cause la sortie de la sous-requĂȘte et notamment un nouveau tri avant le calcul de l'agrĂ©gat.
Les agrégats booléens bool_and
et
bool_or
correspondent aux agrégats du standard SQL
every
et any
ou
some
. PostgreSQL accepte
every
, mais pas any
et
some
, car il y a une ambiguité dans la syntaxe
standard :
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Ici, ANY
peut ĂȘtre considĂ©rĂ© soit comme
introduisant une sous-requĂȘte, soit comme Ă©tant une fonction d'agrĂ©gat,
si la sous-requĂȘte renvoie une ligne avec une valeur boolĂ©enne. De ce
fait, le nom standard ne peut pas ĂȘtre donnĂ© Ă ces agrĂ©gats.
Les utilisateurs habitués à travailler avec d'autres systÚmes de gestion
de bases de donnĂ©es pourraient ĂȘtre déçus par les performances de l'agrĂ©gat
count
quand il est appliqué à la table entiÚre. Une
requĂȘte comme :
SELECT count(*) FROM sometable;
nécessite un effort proportionnel à la taille de la table : PostgreSQL aura besoin de parcourir soit toute la table soit tout un index qui inclut toutes les lignes de la table.
Tableau 9.59 montre les fonctions
d'agrégat typiquement utilisées dans les analyses statistiques. (Elles sont
séparées principalement pour éviter d'encombrer la liste des agrégats plus
fréquemment utilisés.) Les fonctions acceptant
numeric_type
sont disponibles pour les types
smallint
, integer
, bigint
,
numeric
, real
et double precision
.
Quand la description mentionne N
, cela signifie le
nombre de lignes en entrée pour lesquelles les expressions en entrée ne
sont pas NULL. Dans tous les cas, NULL est renvoyé si le calcul n'a pas de
sens, par exemple quand N
vaut zéro.
Tableau 9.59. Fonctions d'agrégat pour les statistiques
Tableau 9.60 montre certaines fonctions
d'agrégat utilisant la syntaxe d'agrégat à ensemble
ordonnĂ©. Ces fonctions sont parfois nommĂ©es fonctions Ă
« distribution inverse ». Leur entrée est introduite par
ORDER BY
, et elles peuvent aussi prendre un
argument direct qui n'est pas agrégé mais calculé
une seule fois. Toutes ces fonctions ignorent les valeurs NULL dans leur
entrée agrégée. Pour celles qui prennent un paramÚtre
fraction
, la valeur de la fraction est comprise
entre 0 et 1 ; une erreur est renvoyée dans le cas contraire.
Néanmoins une valeur de fraction
NULL donne
simplement un résultat NULL.
Tableau 9.60. Fonctions d'agrégat à ensemble trié
Chacun des agrégats d'« ensemble hypothétique » listés dans
Tableau 9.61 est associé avec une
fonction de fenĂȘtrage du mĂȘme nom dĂ©finie dans Section 9.22. Dans chaque cas, le rĂ©sultat de l'agrĂ©gat est
la valeur que la fonction de fenĂȘtrage associĂ©e aurait renvoyĂ©e pour la
ligne « hypothétique » construite à partir de
args
, si une telle ligne a été ajoutée au groupe
trié de lignes représenté par sorted_args
. Pour
chacune de ces fonctions, la liste des arguments directs donnée dans
args
doit correspondre au nombre et types des
arguments agrégés donnés dans sorted_args
.
Contrairement à la plupart des agrégats natifs, ces agrégats ne sont pas
stricts, c'est-à -dire qu'ils ne suppriment pas les lignes en entrée
contenant des NULL. Les valeurs NULL se trient suivant la rÚgle indiquée
dans la clause ORDER BY
.
Tableau 9.61. Fonctions d'agrégat à ensemble hypothétique
Tableau 9.62. Opérations de regroupement
Les opérations de regroupement affichées dans Tableau 9.62 sont utilisées en conjonction avec
les ensembles de regroupement (voir Section 7.2.4) pour distinguer les lignes résultats.
Les arguments Ă la fonction GROUPING
ne sont pas
réellement évalués car ils doivent correspondre exactement aux expressions
données dans la clause GROUP BY
du niveau de requĂȘte
associé. Par exemple :
=>
SELECT * FROM items_sold;
make | model | sales -------+-------+------- Foo | GT | 10 Foo | Tour | 20 Bar | City | 15 Bar | Sport | 5 (4 rows)=>
SELECT make, model, GROUPING(make,model), sum(sales) FROM items_sold GROUP BY ROLLUP(make,model);
make | model | grouping | sum -------+-------+----------+----- Foo | GT | 0 | 10 Foo | Tour | 0 | 20 Bar | City | 0 | 15 Bar | Sport | 0 | 5 Foo | | 1 | 30 Bar | | 1 | 20 | | 3 | 50 (7 rows)
Ici, la valeur 0
dans la colonne
grouping
des quatre premiĂšres lignes montre qu'elles
ont été regroupées normalement par rapport aux colonnes de regroupement.
La valeur 1
indique que la colonne
model
n'a pas été groupé dans les deux lignes
suivantes, et la valeur 3
indique que ni la colonne
make
ni la colonne model
n'ont été
regroupées dans la derniÚre ligne (qui, de ce fait, est un agrégat sur
tous les lignes en entrée).