PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 18 RC1 » Langage SQL » Fonctions et opĂ©rateurs » Fonctions de fenĂȘtrage

9.22. Fonctions de fenĂȘtrage #

Les fonctions de fenĂȘtrage fournissent des moyens pour rĂ©aliser des calculs sur des ensembles de lignes relatives Ă  la ligne actuelle de la requĂȘte. Voir Section 3.5 pour une introduction Ă  cette fonctionnalitĂ©, et Section 4.2.8 pour les dĂ©tails sur la syntaxe.

Les fonctions de fenĂȘtrage natives sont montrĂ©es dans Tableau 9.67. Notez que ces fonctions doivent ĂȘtre appelĂ©es en utilisant la syntaxe des fonctions de fĂ©nĂȘtrage, c'est-Ă -dire en utilisant une clause OVER.

En plus de ces fonctions, toute fonction d'agrĂ©gat standard native ou dĂ©finie par un utilisateur (donc pas les agrĂ©gats Ă  ensemble ordonnĂ© ou Ă  ensemble hypothĂ©tique) peut ĂȘtre utilisĂ©e comme une fonction de fenĂȘtrage ; voir Section 9.21 pour une liste des agrĂ©gats natifs. Les fonctions d'agrĂ©gat agissent comme des fonctions de fenĂȘtrage quand une clause OVER est utilisĂ©e pour l'appel ; sinon elles agissent comme des agrĂ©gats standards et renvoient une seule ligne pour un ensemble complet.

Tableau 9.67. Fonctions de fenĂȘtrage Ă  usage gĂ©nĂ©ral

Fonction

Description

row_number () → bigint

Renvoie le nombre de la ligne courante dans sa partition, en commençant à 1.

rank () → bigint

Renvoie le range de la ligne courante, avec des trous ; c'est-Ă -dire le row_number de la premiĂšre ligne dans son groupe.

dense_rank () → bigint

Renvoie le range de la ligne courante, sans trous ; cette fonction compte rĂ©ellement les groupes.

percent_rank () → double precision

Renvoie le rang relatif de la ligne courante, c'est-Ă -dire (rank - 1) / (total de lignes dans la partition - 1). La valeur est donc comprise entre 0 et 1, les deux inclus.

cume_dist () → double precision

Renvoie la distribution cumulative, c'est-à-dire (nombre de lignes dans la partition précédente ou nombre de groupes à partir de la ligne courante) / (total de lignes dans la partition). La valeur est donc comprise entre 1/N et 1.

ntile ( num_buckets integer ) → integer

Renvoie un entier entre 1 et la valeur argument, divisant la partition aussi également que possible.

lag ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

Renvoie value Ă©valuĂ©e Ă  la ligne qui se trouve Ă  offset lignes avant la ligne actuelle dans la partition ; si une telle ligne n'existe pas, renvoie default Ă  la place (qui doit ĂȘtre d'un type compatible avec value). offset et default sont Ă©valuĂ©s suivant la ligne actuelle. Par dĂ©faut, offset vaut 1 et default vaut NULL.

lead ( value anycompatible [, offset integer [, default anycompatible ]] ) → anycompatible

Renvoie value Ă©valuĂ©e Ă  la ligne qui se trouve Ă  offset lignes aprĂšs la ligne actuelle dans la partition ; si une telle ligne n'existe pas, renvoie default Ă  la place (qui doit ĂȘtre d'un type compatible que value). offset et default sont Ă©valuĂ©s suivant la ligne actuelle. Par dĂ©faut, offset vaut 1 et default vaut NULL.

first_value ( value anyelement ) → anyelement

Renvoie value Ă©valuĂ©e Ă  la premiĂšre ligne de la fenĂȘtre.

last_value ( value anyelement ) → anyelement

Renvoie value Ă©valuĂ©e Ă  la derniĂšre ligne de la fenĂȘtre.

nth_value ( value anyelement, n integer ) → anyelement

Renvoie value Ă©valuĂ©e Ă  la ligne qui se trouve Ă  la n-iĂšme ligne de la fenĂȘtre (en comptant Ă  partir de 1) ; renvoie NULL si cette ligne n'existe pas.


Toutes les fonctions listĂ©es dans Tableau 9.67 dĂ©pendent de l'ordre de tri indiquĂ© par la clause ORDER BY sur la dĂ©finition de la fenĂȘtre associĂ©e. Les lignes qui ne sont pas distinctes lors de la seule considĂ©ration des colonnes ORDER BY sont des peers. Les quatre fonctions de rang (y compris cume_dist) sont dĂ©finies pour qu'elles donnent la mĂȘme rĂ©ponse pour toutes les lignes d'un groupe peer.

Notez que les fonctions first_value, last_value et nth_value ne prennent en compte que les lignes Ă  l'intĂ©rieur d'une « fenĂȘtre Â», qui, par dĂ©faut, contient les lignes du dĂ©but de la partition jusqu'au dernier peer de la ligne actuelle. Ceci risque de donner des rĂ©sultats sans intĂ©rĂȘt pour last_value et quelques fois aussi pour nth_value. Vous pouvez redĂ©finir la fenĂȘtre en ajoutant une spĂ©cification convenable (RANGE, ROWS ou GROUPS) Ă  la clause OVER. Voir Section 4.2.8 pour plus d'informations.

Quand une fonction d'agrĂ©gat est utilisĂ©e comme fonction de fenĂȘtrage, elle agrĂšge les lignes dans la fenĂȘtre de la ligne courante. Un agrĂ©gat utilisĂ© avec ORDER BY et la dĂ©finition par dĂ©faut de la fenĂȘtre produit un type de comportement du style « somme mouvante Â», qui pourrait ĂȘtre ou pas ce qui est souhaitĂ©. Pour obtenir l'agrĂ©gat sur la partition complĂšte, n'utilisez pas ORDER BY ou utilisez ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. Les autres spĂ©cifications de fenĂȘtre peuvent ĂȘtre utilisĂ©es pour obtenir d'autres effets.

Note

Le standard SQL dĂ©finit une option RESPECT NULLS ou IGNORE NULLS pour les fonctions lead, lag, first_value, last_value et nth_value. Ceci n'est pas couvert dans PostgreSQL : le comportement est toujours identique au comportement par dĂ©faut du standard, autrement dit RESPECT NULLS. De mĂȘme, les options du standard FROM FIRST et FROM LAST pour nth_value ne sont pas supportĂ©es : seul le comportement par dĂ©faut, FROM FIRST, l'est. (Vous pouvez obtenir le rĂ©sultat de FROM LAST en inversant le tri ORDER BY.)