Fonctions de fenêtre (OVER)
Une fonction de fenêtre calcule un agrégat sur un groupe de lignes tout en gardant chaque ligne, à l'inverse de GROUP BY. On compare ainsi chaque salaire à la moyenne de son service.
- window
- OVER
- PARTITION BY
- fenêtre
- analytique
Syntaxe
SELECT col, fonction(col) OVER ( [PARTITION BY groupe] [ORDER BY tri] ) AS aliasFROM table;Exemple
SELECT name, department_id, salary, AVG(salary) OVER (PARTITION BY department_id) AS moyenne_service, salary - AVG(salary) OVER (PARTITION BY department_id) AS ecartFROM employeesWHERE department_id IN (2, 4)ORDER BY department_id, salary DESC;-- Jeu de données : entreprise-- Résultat attendu :-- Olivier Caron | 2 | 78000 | 58000 | 20000-- Quentin Faure | 2 | 54000 | 58000 | -4000-- Rachid Amrani | 2 | 51000 | 58000 | -7000-- Wendy Roche | 2 | 49000 | 58000 | -9000-- Sandrine Lopez | 4 | 58000 | 50000 | 8000-- Théo Brun | 4 | 42000 | 50000 | -8000À retenir
- PARTITION BY découpe les lignes en groupes indépendants. Sans PARTITION BY, la fenêtre couvre tout le résultat : SUM(salary) OVER () donne la masse salariale totale sur chaque ligne.
- Quand la même fenêtre revient, nommez-la : … AVG(salary) OVER w … FROM employees WINDOW w AS (PARTITION BY department_id).
- Piège : ajouter ORDER BY dans OVER change le calcul. Le cadre par défaut devient « du début jusqu'à la ligne courante » : AVG(salary) OVER (ORDER BY hired_at) donne une moyenne cumulée, pas la moyenne du groupe.
- Piège : une fonction de fenêtre ne peut pas figurer dans WHERE, car elle est calculée après. Filtrez son résultat dans une CTE ou une sous-requête.
- Disponibles dans SQLite 3.25+, PostgreSQL, SQL Server et MySQL 8+.
Voir aussi
- ROW_NUMBER, RANK, DENSE_RANKLes fonctions de classement numérotent les lignes selon un tri, éventuellement par groupe. Elles répondent aux questions de type « top N par catégorie » qu'un simple LIMIT ne sait pas traiter.
- LAG, LEAD et cumulsLAG lit la valeur de la ligne précédente, LEAD celle de la suivante, et SUM() OVER (ORDER BY …) calcule un cumul. On compare ainsi une période à la précédente ou on suit un total qui grandit.
- COUNT & GROUP BYGROUP BY range les lignes en groupes selon une ou plusieurs colonnes, puis COUNT, SUM ou AVG calculent une valeur par groupe. On obtient un tableau de synthèse, une ligne par groupe.
- Ordre logique d'exécutionUne requête ne s'évalue pas dans l'ordre où on l'écrit : FROM vient d'abord, SELECT presque à la fin. Connaître cet ordre explique la plupart des erreurs d'alias et d'agrégats.