Les fonctions 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 pour une introduction à cette fonctionnalité, et Section 4.2.8 pour les détails sur la syntaxe.
Les fonctions window internes sont listées dans Tableau 9.60. 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 normale d'agrégat, interne ou
définie par l'utilisateur (mais pas les agrégats d'ensemble trié ou
d'ensemble hypothétique) peut être utilisée comme une fonction window
(voir Section 9.20 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
et renvoient une seule ligne pour l'ensemble entier.
Tableau 9.60. Fonctions Window généralistes
Toutes les fonctions listées dans Tableau 9.60 dépendent du tri indiqué par la
clause ORDER BY
de la définition window associée.
Les lignes qui ne sont pas distinctes en considérant uniquement les
colonnes ORDER BY
sont des
pairs ; les quatre fonctions de rang
(incluant cume_dist
) sont définies de 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 donner des résultats peu
intéressants pour last_value
et quelques fois aussi
pour nth_value
. Vous pouvez redéfinir la frame en
ajoutant une spécification convenable de frame (avec
RANGE
ou ROWS
) dans la clause
OVER
. Voir Section 4.2.8
pour plus d'informations sur les spécifications de la frame.
Quand une fonction d'agrégat est utilisée comme fonction window, elle aggrège
les lignes sur la frame window de la ligne en cours de traitement. Pour
obtenir un agrégat sur la partition complète, omettez ORDER
BY
ou utilisez ROWS BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
. 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
être souhaité, ou pas.
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 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
.)
cume_dist
calcule la fraction des lignes de la
partition qui sont inférieures ou égales à la ligne courante et ses pairs,
alors que percent_rank
calcule la fraction des lignes
de la partition qui sont inférieures ou égales à la ligne courante, en
supposant que la ligne courante n'existe pas dans la partition.