Documentation PostgreSQL 8.4.22 > Langage SQL > Fonctions et opérateurs > Fonctions Window | |
Fonctions d'agrégat | Expressions de sous-requêtes |
Les fonction Window fournissent la possibilité de réaliser des calculs au travers d'ensembles de lignes relatifs à la ligne de la requête en cours. Voir Section 3.5, « Fonctions de fenêtrage » pour une introduction à cette fonctionnalité.
Les fonctions window internes sont listées dans Tableau 9.44, « Fonctions Window généralistes ». Notez que ces fonctions doivent être appelées en utilisant la syntaxe des fonctions window ; autrement dit, une clause OVER est requise.
En plus de ces fonctions, toute fonction d'agrégat interne ou définie par l'utilisateur peut être utilisée comme une fonction window (voir Section 9.18, « Fonctions d'agrégat » pour une liste des agrégats internes). Les fonctions d'agrégat agissent comme des fonctions window seulement quand une clause OVER suit l'appel ; sinon elles agissent comme des agrégats standards.
Tableau 9.44. Fonctions Window généralistes
Fonction | Type renvoyé | Description |
---|---|---|
row_number() | bigint | numéro de la ligne en cours de traitement dans sa partition, en comptant à partir de 1 |
rank() | bigint | rang de la ligne en cours de traitement, avec des trous ; identique row_number pour le premier pair |
dense_rank() | bigint | rang de la ligne en cours de traitement, sans trous ; cette fonction compte les groupes de pairs |
percent_rank() | double precision | rang relatif de la ligne en cours de traitement ;: (rank - 1) / (nombre total de lignes - 1) |
cume_dist() | double precision | rang relatif de la ligne en cours de traitement : (nombre de lignes précédentes, ou pair de la ligne en cours) / (nombre de lignes total) |
ntile(num_buckets integer) | integer | entier allant de 1 à la valeur de l'argument, divisant la partition aussi équitablement que possible |
lag(value any [, offset integer [, default any ]]) | même type que value | renvoit value évalué à la ligne qui est offset lignes avant la ligne actuelle à l'intérieur de la partition ; s'il n'y a pas de ligne, renvoit à la place default. offset et default sont évalués par rapport à la ligne en cours. Si omis, offset a comme valeur par défaut 1 et default est NULL |
lead(value any [, offset integer [, default any ]]) | same type as value | renvoit value évalué à la ligne qui est offset lignes après la ligne actuelle à l'intérieur de la partition ; s'il n'y a pas de ligne, renvoit à la place default. offset et default sont évalués par rapport à la ligne en cours. Si omis, offset a comme valeur par défaut 1 et default est NULL |
first_value(value any) | même type que value | renvoit value évaluée à la ligne qui est la première ligne du frame window |
last_value(value any) | même type que value | renvoit value évaluée à la ligne qui est la dernière ligne du frame window |
nth_value(value any, nth integer) | même type que value | renvoit value évaluée à la ligne qui est lanth-ième ligne de la frame window (en comptant à partir de 1) ; NULL si aucune ligne |
Toutes les fonctions listées dans Tableau 9.44, « Fonctions Window généralistes » dépendent du tri indiqué par la clause ORDER BY de la définition window associée. Les lignes qui ne sont pas distinctes dans le tri ORDER BY sont des pairs ; les quatre fonctions de rang sont définies de ce façon à ce qu'elles donnent la même réponse pour toutes les lignes pairs.
Notez que first_value, last_value et nth_value considèrent seulement les lignes à l'intérieur du « frame window » qui contient par défaut les lignes du début de la partition jusqu'au dernier pair de la ligne en cours. Cela risque de données des résultats inintéressants pour nth_value et tout particulièrement last_value. Vous pouvez redéfinir le frame comme étant la partition complète en ajoutant ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING à la clause OVER. Voir Section 4.2.8, « Appels de fonction window » pour plus d'informations.
Quand une fonction d'agrégat est utilisée comme fonction window, il aggrège les lignes sur le frame window de la ligne en cours de traitement. Un agrégat utilisé avec ORDER BY et la définition de la frame window par défaut produit un comportement de type « somme en cours d'exécution », qui pourrait ou ne pas être souhaité. Pour obtenir un agrégat sur la partition complète, omettez ORDER BY ou utilisez ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. Other frame specifications can be used to obtain other effects.
Le standard SQL définit une option RESPECT NULLS ou IGNORE NULLS pour lead, lag, first_value, last_value et nth_value. Ceci n'est pas implanté dans PostgreSQL™ : le comportement est toujours le même que dans le comportement par défaut du standard, nommément RESPECT NULLS. De la même façon, les options FROM FIRST ou FROM LAST pour nth_value ne sont pas implantées : seul le comportement FROM FIRST est supporté par défaut. (Vous pouvez obtenir le résultat d'un FROM LAST en inversant l'ordre du ORDER BY.)