Les fonctions de fenêtrage permettent d'effectuer des calculs sur un ensemble de lignes liées à la ligne courante, sans regrouper les résultats comme le ferait GROUP BY. Chaque ligne d'origine reste visible, avec une colonne calculée en plus.
Window functions let you perform calculations across a set of rows related to the current row, without collapsing the results the way GROUP BY does. Every original row stays visible, with an extra calculated column.
La syntaxe OVER()
The OVER() Syntax
Toute fonction de fenêtrage s'utilise avec la clause OVER(), qui définit la "fenêtre" de lignes sur laquelle la fonction s'applique.
Every window function is used with an OVER() clause, which defines the "window" of rows the function operates on.
SELECT nom, departement, salaire,
AVG(salaire) OVER () AS salaire_moyen_general
FROM employes;
SELECT name, department, salary,
AVG(salary) OVER () AS overall_avg_salary
FROM employees;
PARTITION BY : des fenêtres par groupe
PARTITION BY: Windows Per Group
PARTITION BY divise les lignes en groupes, et la fonction est réévaluée pour chaque groupe séparément — sans réduire le nombre de lignes retournées.
PARTITION BY splits rows into groups, and the function is re-evaluated for each group separately — without reducing the number of rows returned.
SELECT nom, departement, salaire,
AVG(salaire) OVER (PARTITION BY departement) AS moyenne_departement
FROM employes;
SELECT name, department, salary,
AVG(salary) OVER (PARTITION BY department) AS department_avg
FROM employees;
Les fonctions de classement
Ranking Functions
| Fonction | Comportement |
|---|---|
| ROW_NUMBER() | Numéro unique et séquentiel, même en cas d'égalité |
| RANK() | Même rang pour les égalités, avec un saut de numéro ensuite |
| DENSE_RANK() | Même rang pour les égalités, sans saut de numéro |
| Function | Behavior |
|---|---|
| ROW_NUMBER() | Unique, sequential number, even for ties |
| RANK() | Same rank for ties, with a gap in numbering afterward |
| DENSE_RANK() | Same rank for ties, with no gap in numbering |
SELECT nom, departement, salaire,
RANK() OVER (PARTITION BY departement ORDER BY salaire DESC) AS rang_salaire
FROM employes;
SELECT name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees;
LAG et LEAD : comparer avec une autre ligne
LAG and LEAD: Comparing With Another Row
LAG() accède à la valeur d'une ligne précédente, et LEAD() à celle d'une ligne suivante, selon l'ordre défini — très utile pour calculer une variation d'une période à l'autre.
LAG() accesses the value from a previous row, and LEAD() the value from a following row, based on the defined order — very useful for computing period-over-period change.
SELECT mois, ventes,
ventes - LAG(ventes) OVER (ORDER BY mois) AS variation
FROM ventes_mensuelles;
SELECT month, sales,
sales - LAG(sales) OVER (ORDER BY month) AS change
FROM monthly_sales;
GROUP BY, les fonctions de fenêtrage peuvent être combinées librement avec des colonnes non agrégées dans le même SELECT, puisqu'aucune ligne n'est fusionnée.
Tip: unlike GROUP BY, window functions can be freely combined with non-aggregated columns in the same SELECT, since no rows are merged.
Points clés à retenir
Key Takeaways
- Utilisez
PARTITION BYpour réinitialiser le calcul à chaque groupe, etORDER BYà l'intérieur deOVER()pour définir la séquence - Préférez
ROW_NUMBER()quand vous avez besoin d'un identifiant unique (ex. dédoublonnage), etRANK()/DENSE_RANK()pour un classement métier - Les fonctions de fenêtrage sont évaluées après
WHEREetGROUP BY, mais avantORDER BYfinal
- Use
PARTITION BYto reset the calculation for each group, andORDER BYinsideOVER()to define the sequence - Prefer
ROW_NUMBER()when you need a unique identifier (e.g., deduplication), andRANK()/DENSE_RANK()for business ranking - Window functions are evaluated after
WHEREandGROUP BY, but before the finalORDER BY
