Les fonctions d'agrégat calculent une valeur unique à partir d'un ensemble de valeurs en entrée. Les fonctions d'aggrégat généralistes fournies par défaut sont listées dans Tableau 9.52 et les agrégats statistiques dans Tableau 9.53. Les fonctions d'agrégat par défaut pour les ensembles ordonnés au sein d'un groupe sont listées dans Tableau 9.54 alors que celles fournies par défaut pour les ensembles hypothétiques au sein d'un groupe sont dans Tableau 9.55. Les opérations de regroupement, qui sont proches des fonctions d'agrégats, sont listées dans le Tableau 9.56. La syntaxe particulière des fonctions d'agrégat est décrite dans la Section 4.2.7. La Section 2.7 fournit un supplément d'informations introductives.
Tableau 9.52. Fonctions d'agrégat générales
Fonction | Type d'argument | Type de retour | Mode partiel | Description |
---|---|---|---|---|
array_agg(
| tout type non tableau | tableau du type de l'argument | Non | les valeurs en entrée, pouvant inclure des valeurs NULL, concaténées dans un tableau |
array_agg(
| tout type tableau | identique au type de données de l'argument | Non | les tableaux en entrée sont concaténés dans un tableau englobant (les tableaux en entrée doivent tous être de même dimension et ne peuvent être vides ou NULL) |
avg(
|
smallint , int ,
bigint , real ,
double precision , numeric ou interval
|
numeric pour tout argument de type entier,
double precision pour tout argument en virgule flottante,
sinon identique au type de données de l'argument
| Oui | la moyenne arithmétique de toutes les valeurs non NULL en entrée |
bit_and(
|
smallint , int , bigint ou
bit
| identique au type de données de l'argument | Oui | le AND bit à bit de toutes les valeurs non NULL en entrée ou NULL s'il n'y en a pas |
bit_or(
|
smallint , int , bigint ou
bit
| identique au type de données de l'argument | Oui | le OR bit à bit de toutes les valeurs non NULL en entrée ou NULL s'il n'y en a pas |
bool_and(
|
bool
|
bool
| Oui | true si toutes les valeurs en entrée valent true, false sinon |
bool_or(
|
bool
|
bool
| Oui | true si au moins une valeur en entrée vaut true, false sinon |
count(*)
| bigint | Oui | nombre de lignes en entrée | |
count ( | tout type | bigint | Oui |
nombre de lignes en entrée pour lesquelles
l'expression n'est pas NULL
|
every(
| bool | bool | Oui | équivalent à bool_and |
json_agg(
|
any
|
json
| Non | agrège les valeurs, incluant les NULL, sous la forme d'un tableau JSON |
jsonb_agg(
|
any
|
jsonb
| Non | agrège les valeurs sous la forme d'un tableau JSON |
json_object_agg(
|
(any, any)
|
json
| Non | agrège les paires nom/valeur en tant qu'objet JSON ; les valeurs peuvent être NULL, mais pas les nom |
jsonb_object_agg(
|
(any, any)
|
jsonb
| Non | agrège les paires nom/valeur en tant qu'objet JSON ; les valeurs peuvent être NULL, mais pas les nom |
max(
| tout type numeric, string, date/time, network, or enum ou tableau de ces types | identique au type en argument | Oui |
valeur maximale de l'expression
pour toutes les valeurs non NULL en entrée
|
min(
| tout type numeric, string, date/time, network ou enum, ou tableaux de ces types | identique au type en argument | Oui |
valeur minimale de l'expression
pour toutes les valeurs non NULL en entrée
|
string_agg(
|
(text , text ) ou (bytea , bytea )
| identique aux arguments | Non | valeurs non NULL en entrée concaténées dans une chaîne, séparées par un délimiteur |
sum(
|
smallint , int ,
bigint , real , double precision , numeric ,
interval ou money
|
bigint pour les arguments de type smallint ou
int , numeric pour les arguments de type
bigint , sinon identique au type de
données de l'argument
| Oui | somme de l'expression
pour toutes les valeurs non NULL en entrée |
xmlagg(
|
xml
|
xml
| Non | concaténation de valeurs XML non NULL (voir aussi Section 9.14.1.7) |
En dehors de count
, ces
fonctions renvoient une valeur NULL si aucune ligne n'est sélectionnée. En
particulier, une somme (sum
) sur aucune ligne renvoie
NULL et non zéro, et array_agg
renvoie NULL plutôt
qu'un tableau vide quand il n'y a pas de lignes en entrée. La fonction
coalesce
peut être utilisée pour substituer des zéros
ou un tableau vide aux valeurs NULL quand cela est nécessaire.
Les fonctions d'agrégat qui supportent le mode partiel sont éligibles à participer à différentes optimisations, tel que les agrégats parallèles.
Les agrégats booléens bool_and
et
bool_or
correspondent aux agrégats standard du SQL
every
et any
ou
some
.
Pour any
et some
, il
semble qu'il y a une ambiguïté 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 si l'expression de sélection ne
renvoie qu'une ligne. Du coup, le nom standard ne peut être donné à ces
agrégats.
Les utilisateurs habitués à travailler avec d'autres systèmes de gestion de
bases de données SQL peuvent être surpris par les performances de
l'agrégat count
lorsqu'il est appliqué à la
table entière. En particulier, une requête identique à
SELECT count(*) FROM ma_table;
nécessitera un travail proportionnel à la taille de la table : PostgreSQL devra parcourir complètement la table ou un de ses index (comprenant toutes les lignes de la table).
Les fonctions d'agrégat array_agg
,
json_agg
, jsonb_agg
,
json_object_agg
, jsonb_object_agg
,
string_agg
et
xmlagg
, ainsi que d'autres fonctions similaires d'agrégats
définies par l'utilisateur, produisent des valeurs de résultats qui ont un sens
différents, dépendant de l'ordre des valeurs en entrée. Cet ordre n'est pas
précisé par défaut mais peut être contrôlé en ajoutant une clause
ORDER BY
comme indiquée dans Section 4.2.7. Une alternative revient à fournir les
valeurs à partir d'une sous-requête triée fonctionnera 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 la requête externe contient un traitement supplémentaire, telle qu'une jointure, car cela pourrait causer le tri de la sortie de la sous-requête avant le calcul de l'agrégat.
Tableau 9.53 présente les fonctions
d'agrégat typiquement utilisées dans l'analyse statistique.
(Elles sont séparées pour éviter de grossir la liste des agrégats les plus
utilisés.) Là où la description mentionne
N
, cela représente le nombre
de lignes en entrée pour lesquelles toutes les expressions en entrée sont
non NULL. Dans tous les cas, NULL est renvoyé si le calcul n'a pas de
signification, par exemple si N
vaut zéro.
Tableau 9.53. Fonctions d'agrégats pour les statistiques
Tableau 9.54 montre certaines fonctions d'agrégat qui utilisent la syntaxe des agrégats d'ensemble trié Ces fonctions sont parfois référencées en tant que fonctions de « distribution inverse ».
Tableau 9.54. Fonctions d'agrégat par ensemble trié
Tous les agrégats listés dans Tableau 9.54
ignorent les valeurs NULL dans leur entrée triée. Pour ceux qui prennent un
paramètre fraction
, la valeur de la fraction doit
valoir entre 0 et 1 ; une erreur est renvoyée dans le cas contraire.
Néanmoins, une valeur nulle de fraction produit simplement un résultat nul.
Chaque agrégat listé dans Tableau 9.55
est associé avec une fonction de fenêtrage de même définie dans
Section 9.21. 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 calculé à partir de sorted_args
.
Tableau 9.55. Fonctions d'agrégat par ensemble hypothétique
Pour chacun de ces agrégats par ensemble trié, la liste des arguments directs
donnés dans args
doit correspondre au nombre et
aux types des arguments d'agrégat donnés dans
sorted_args
. Contrairement aux agrégats internes,
ces agrégats ne sont pas stricts, c'est-à-dire qu'ils ne suppriment pas les
lignes en entrée contentant des NULL. Les valeurs NULL sont triées suivant
la règle spécifiée dans la clause ORDER BY
.
Tableau 9.56. Opérations de regroupement
Les opérations de regroupement sont utilisées en
conjonction avec les ensembles de regroupement (voir
Section 7.2.4) pour distinguer les lignes
résultantes. Les arguments de GROUPING
ne
sont pas évalués, mais ils doivent correspondre exactement aux
expressions indiquées dans la clause GROUP BY
de la requête associée. Les bits sont assignés avec l'argument
le plus à droite comme le bit le moins significatif ; chaque
bit est à 0 si l'expression correspondante est incluse dans le
critère de regroupement générant la ligne résultat, et à 1 si
elle ne l'est pas. 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)