PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 15.14 » Langage SQL » Fonctions et opérateurs » Fonctions d'agrégat

9.21. Fonctions d'agrĂ©gat

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

array_agg ( anynonarray ) → anyarray

RécupÚre toutes les valeurs en entrée, y compris les NULL, et les place dans un tableau.

No

array_agg ( anyarray ) → anyarray

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

avg ( smallint ) → numeric

avg ( integer ) → numeric

avg ( bigint ) → numeric

avg ( numeric ) → numeric

avg ( real ) → double precision

avg ( double precision ) → double precision

avg ( interval ) → interval

Calcule la moyenne (arithmétique) de toutes les valeurs en entrée, non NULL.

Yes

bit_and ( smallint ) → smallint

bit_and ( integer ) → integer

bit_and ( bigint ) → bigint

bit_and ( bit ) → bit

Calcule un AND bit à bit de toutes les valeurs en entrée non NULL.

Yes

bit_or ( smallint ) → smallint

bit_or ( integer ) → integer

bit_or ( bigint ) → bigint

bit_or ( bit ) → bit

Calcule un OR bit à bit de toutes les valeurs en entrée non NULL.

Yes

bit_xor ( smallint ) → smallint

bit_xor ( integer ) → integer

bit_xor ( bigint ) → bigint

bit_xor ( bit ) → bit

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

bool_and ( boolean ) → boolean

Renvoie true si toutes les valeurs en entrée non NULL valent true, sinon false.

Yes

bool_or ( boolean ) → boolean

Renvoie true si au moins une des valeurs en entrée non NULL vaut true, sinon false.

Yes

count ( * ) → bigint

Calcule le nombre de lignes en entrée.

Yes

count ( "any" ) → bigint

Calcule le nombre de lignes en entrée pour lesquelles la valeur n'est pas NULL.

Yes

every ( boolean ) → boolean

Ceci est l'équivalent de bool_and pour le standard SQL.

Yes

json_agg ( anyelement ) → json

jsonb_agg ( anyelement ) → jsonb

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 to_json ou to_jsonb.

No

json_object_agg ( key "any", value "any" ) → json

jsonb_object_agg ( key "any", value "any" ) → jsonb

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 to_json ou to_jsonb. Les valeurs peuvent ĂȘtre NULL, mais pas les clĂ©s.

No

max ( see text ) → same as input type

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 inet, interval, money, oid, pg_lsn, tid, xid8 et les tableaux de chacun de ces types.

Yes

min ( see text ) → same as input type

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 inet, interval, money, oid, pg_lsn, tid, xid8 et les tableaux de chacun de ces types.

Yes

range_agg ( value anyrange ) → anymultirange

range_agg ( value anymultirange ) → anymultirange

Calcule l'union des valeurs non NULL en entrée.

No

range_intersect_agg ( value anyrange ) → anyrange

range_intersect_agg ( value anymultirange ) → anymultirange

Calcule l'intersection des valeurs non NULL en entrée.

No

string_agg ( value text, delimiter text ) → text

string_agg ( value bytea, delimiter bytea ) → bytea

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 delimiter correspondant (s'il n'est pas NULL).

No

sum ( smallint ) → bigint

sum ( integer ) → bigint

sum ( bigint ) → numeric

sum ( numeric ) → numeric

sum ( real ) → real

sum ( double precision ) → double precision

sum ( interval ) → interval

sum ( money ) → money

Calcule la somme de toutes les valeurs en entrée non NULL.

Yes

xmlagg ( xml ) → xml

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.

Note

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.

Note

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

Fonction

Description

Mode Partiel

corr ( Y double precision, X double precision ) → double precision

Calcule le coefficient de corrélation.

Yes

covar_pop ( Y double precision, X double precision ) → double precision

Calcule la covariance de population.

Yes

covar_samp ( Y double precision, X double precision ) → double precision

Calcule la covariance d'échantillon.

Yes

regr_avgx ( Y double precision, X double precision ) → double precision

Calcule la moyenne de la variable indépendante, sum(X)/N.

Yes

regr_avgy ( Y double precision, X double precision ) → double precision

Calcule la moyenne de la variable dépendante, sum(Y)/N.

Yes

regr_count ( Y double precision, X double precision ) → bigint

Calcule le nombre de lignes pour lesquelles les deux entrées sont non NULL.

Yes

regr_intercept ( Y double precision, X double precision ) → double precision

Calcule l'ordonnée à l'origine de l'équation d'ajustement linéaire par les moindres carrés déterminée par les paires de valeurs (X, Y).

Yes

regr_r2 ( Y double precision, X double precision ) → double precision

Calcule le carré du coefficient de corrélation.

Yes

regr_slope ( Y double precision, X double precision ) → double precision

Calcule la pente de la droite de l'équation d'ajustement linéaire par les moindres carrés déterminée par les paires de valeurs (X, Y).

Yes

regr_sxx ( Y double precision, X double precision ) → double precision

Calcule la « somme des carrĂ©s Â» de la variable indĂ©pendante, sum(X^2) - sum(X)^2/N.

Yes

regr_sxy ( Y double precision, X double precision ) → double precision

Calcule la « somme des produits Â» des variables dĂ©pendantes heures indĂ©pendantes, sum(X*Y) - sum(X) * sum(Y)/N.

Yes

regr_syy ( Y double precision, X double precision ) → double precision

Calcule la « somme des carrĂ©s Â» de la variable dĂ©pendante, sum(Y^2) - sum(Y)^2/N.

Yes

stddev ( numeric_type ) → double precision pour real ou double precision, sinon numeric

Alias historique pour stddev_samp.

Yes

stddev_pop ( numeric_type ) → double precision pour real ou double precision, sinon numeric

Calcule la déviation standard de la population pour les valeurs en entrée.

Yes

stddev_samp ( numeric_type ) → double precision pour real ou double precision, sinon numeric

Calcule la déviation standard d'échantillon des valeurs en entrée.

Yes

variance ( numeric_type ) → double precision pour real ou double precision, sinon numeric

Alias historique pour var_samp.

Yes

var_pop ( numeric_type ) → double precision pour real ou double precision, sinon numeric

Calcule la variance de la population pour les valeurs en entrée (carré de la déviation standard de la population).

Yes

var_samp ( numeric_type ) → double precision for real or double precision, otherwise numeric

Calcule la variance d'échantillon des valeurs en entrée (carré de la déviation standard d'échantillon).

Yes

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Ă©

Fonction

Description

Mode Partiel

mode () WITHIN GROUP ( ORDER BY anyelement ) → anyelement

Calcule le mode, la valeur la plus frĂ©quente d'un argument agrĂ©gĂ© (en choisissant arbitrairement le premier s'il y a plusieurs valeurs de frĂ©quence Ă©gale). L'argument agrĂ©gĂ© doit ĂȘtre d'un type triable.

No

percentile_cont ( fraction double precision ) WITHIN GROUP ( ORDER BY double precision ) → double precision

percentile_cont ( fraction double precision ) WITHIN GROUP ( ORDER BY interval ) → interval

Calcule le pourcentage continu, une valeur correspondant à la fraction à l'intérieur d'un ensemble ordonné de valeurs d'argument agrégées. Ceci va interpoler entre les éléments en entrée adjacents si nécessaire.

No

percentile_cont ( fractions double precision[] ) WITHIN GROUP ( ORDER BY double precision ) → double precision[]

percentile_cont ( fractions double precision[] ) WITHIN GROUP ( ORDER BY interval ) → interval[]

Calcule plusieurs pourcentages continues. Le rĂ©sultat est un tableau de mĂȘmes dimensions que le paramĂštre fractions, avec chaque Ă©lĂ©ment non NULL remplacĂ© par la valeur (potentiellement interpolĂ©e) correspondance Ă  ce pourcentage.

No

percentile_disc ( fraction double precision ) WITHIN GROUP ( ORDER BY anyelement ) → anyelement

Calcule le pourcentage discret, la premiĂšre valeur avec l'ensemble de tri des valeurs d'argument agrĂ©gĂ© dont la position dans le tri est Ă©gale ou dĂ©passe la fraction indiquĂ©e. L'argument agrĂ©gĂ© doit ĂȘtre d'un type triable.

No

percentile_disc ( fractions double precision[] ) WITHIN GROUP ( ORDER BY anyelement ) → anyarray

Calcule plusieurs pourcentages discrets. Le rĂ©sultat est un tableau de mĂȘmes dimensions que le paramĂštre fractions, avec chaque Ă©lĂ©ment non NULL remplacĂ© par la valeur en entrĂ©e correspondant Ă  ce pourcentage. L'argument agrĂ©gĂ© doit ĂȘtre d'un type triable.

No

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

Fonction

Description

Mode Partiel

rank ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → bigint

Calcule le rang de la ligne hypothĂ©tique avec des trous ; c'est-Ă -dire le numĂ©ro de la premiĂšre ligne dans son groupe.

No

dense_rank ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → bigint

Calcule le rang de la ligne hypothĂ©tique sans trous ; cette fonction compte rĂ©ellement le nombre de groupes.

No

percent_rank ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → double precision

Calcule le rang relatif de la ligne hypothétique, c'est-à-dire (rank - 1) / (lignes totales - 1). La valeur est donc comprise entre 0 et 1, les deux étant inclus.

No

cume_dist ( args ) WITHIN GROUP ( ORDER BY sorted_args ) → double precision

Calcule la distribution cumulative, c'est-à-dire (nombre de lignes précédentes ou proches de la ligne hypothétique) / (total de lignes). La valeur est donc comprise entre 1/N et 1.

No

Tableau 9.62. OpĂ©rations de regroupement

Fonction

Description

GROUPING ( group_by_expression(s) ) → integer

Renvoie un masque de bits indiquant les expressions GROUP BY non incluses dans l'ensemble de regroupement actuel. Les bits sont affectĂ©s avec l'argument le plus Ă  droit correspondant au bit de plus faible poids ; chaque bit vaut 0 si l'expression correspondante est inclus dans le critĂšre de regroupement de l'ensemble de regroupement gĂ©nĂ©rant la ligne rĂ©sultat actuelle, et 1 dans le cas contraire.


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).