XamSQL — la salle de sport SQL des francophones

Avancé · 35 min

Window functions : calculer sur une fenêtre de lignes

Parfois on veut calculer un rang, une moyenne mobile, ou un agrégat sans perdre le detail des lignes.

Contexte

Parfois on veut calculer un rang, une moyenne mobile, ou un agrégat sans perdre le detail des lignes. Les window functions permettent de faire des calculs sur un sous-ensemble de lignes (la fenêtre) defini par OVER, sans GROUP BY qui reducerait le resultat.

Explication

Une window function applique un calcul sur une 'fenêtre' de lignes definie par OVER.

Syntaxe : SELECT ..., fonction() OVER (PARTITION BY colonne ORDER BY colonne) AS alias FROM ...;

Fonctions courantes :

Exemple guidé

Objectif : calculer le rang de chaque note sans perdre le detail.

1. ROW_NUMBER() donne un numero unique order by note DESC 2. On peut aussi utiliser RANK() pour les ex æquo 3. La fenêtre est definie par OVER (ORDER BY note DESC)

SELECT id, note, ROW_NUMBER() OVER (ORDER BY note DESC) AS rang
FROM notes
ORDER BY rang;
idnoterang
12181
917.52
516.53
13164
715.55
6156
25157
1414.58
3149
221410
2013.511
2313.512
81313
2612.514
11215
171216
181217
1511.518
241119
1110.520
41021
211022
109.523
19924
28.525
16826
277.527

À retenir

OVER () definit la fenêtre de la window function. PARTITION BY divise en groupes (comme GROUP BY mais sans reduire les lignes). ROW_NUMBER = numero unique, RANK = rang avec sauts, DENSE_RANK = sans sauts. LAG/LEAD pour naviguer entre les lignes adjacentes.

Exercices de cette leçon

Faire les exercices →