9.15. Fonctions d'agrégat

Les fonctions d'agrégat calculent une seule valeur résultant d'un ensemble de valeurs en entrée. Tableau 9-43 affiche les fonctions d'agrégat intégrées. Les considérations spéciales sur la syntaxe des fonctions d'agrégat sont expliquées dans Section 4.2.7. Consultez Section 2.7 pour un supplément d'informations introductives.

Tableau 9-43. Fonctions d'agrégat

FonctionType d'argumentType de retourDescription
avg(expression) smallint, integer, 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 la moyenne (au sens arithmétique) de toutes les valeurs en entrée
count(*) bigintnombre de valeurs en entrée
count(expression)tout typebigint nombre de valeurs en entrée pour lesquelles l'expression n'est pas nulle
max(expression)tout type numeric, string ou date/timeidentique au type en argument valeur maximale de l'expression pour toutes les valeurs en entrée
min(expression)tout type numeric, string ou date/timeidentique au type en argument valeur minimale de l'expression pour toutes les valeurs en entrée
stddev(expression) smallint, integer, bigint, real, double precision ou numeric double precision pour les arguments en virgule flottante, sinon numeric déviation standard des valeurs en entrée
sum(expression) smallint, integer, bigint, real, double precision, numeric ou interval bigint pour les arguments de type smallint ou integer, numeric pour les arguments de type bigint, double precision pour les arguments en virgule flottante, sinon identique au type de données de l'argument somme de l'expression pour toutes les valeurs en entrée
variance(expression) smallint, integer, bigint, real, double precision ou numeric double precision pour les arguments en virgule flottante, sinon numeric simple variance des valeurs en entrée (carré de la déviation)

Il devrait être noté qu'en dehors de count, ces fonctions renvoient une valeur nulle si aucune ligne n'est sélectionnée. En particulier, une somme (sum) sur aucune ligne renvoie NULL et non pas zéro. La fonction coalesce pourrait être utilisée pour substituer des zéros aux valeurs nulles quand cela est nécessaire.

Note : Les utilisateurs habitués à travailler avec d'autres systèmes de gestion de bases de données SQL pourraient être surpris par les caractéristiques de performances de certains fonctions d'agrégat avec PostgreSQL lorsque l'agrégat est appliqué à la table entière (autrement dit, pas de clause WHERE). En particulier, une requête identique à

SELECT min(col) FROM matable;

sera exécuté par PostgreSQL en utilisant un parcours séquentiel de la table entière. D'autres systèmes de bases de données pourraient optimiser de telles requêtes en utilisant un index sur la colonne si celui-ci est disponible. De même, les fonctions d'agrégat max() et count() requièrent toujours un parcours séquentiel si elles s'appliquent à la table entière avec PostgreSQL.

PostgreSQL ne peut pas implémenter facilement cette optimisation parce qu'elle autorise aussi les requêtes d'agrégat définies par l'utilisateur. Comme min(), max() et count() sont définies en utilisant l'API générique des fonctions d'agrégat, rien n'est prévu pour les cas spéciaux lors de l'exécution de ces fonctions sous certaines circonstances.

Heureusement, il existe un contournement simple de min() et max(). la requête montrée ci-dessous est équivalent à la requête ci-dessus, si ce n'est qu'elle prend avantage de l'index B-tree s'il existe sur cette colonne.

SELECT col FROM matable ORDER BY col ASC LIMIT 1;

Une requête similaire (obtenue en substituant DESC avec ASC dans la requête ci-dessus) peut être utilisé à la place de max()).

Malheureusement, il n'existe pas de requête triviale similaire pouvant être utilisée pour améliorer les performances de count() si cela s'applique à la table entière.