Requêtes avancéesAdvanced Queries · 5 août 2026 · 8 min de lecture· August 5, 2026 · 8 min read

Les fonctions de fenêtrage en SQL (window functions)

SQL Window Functions Explained

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

FonctionComportement
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
FunctionBehavior
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;
Astuce : contrairement à 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 BY pour réinitialiser le calcul à chaque groupe, et ORDER BY à l'intérieur de OVER() pour définir la séquence
  • Préférez ROW_NUMBER() quand vous avez besoin d'un identifiant unique (ex. dédoublonnage), et RANK()/DENSE_RANK() pour un classement métier
  • Les fonctions de fenêtrage sont évaluées après WHERE et GROUP BY, mais avant ORDER BY final
  • Use PARTITION BY to reset the calculation for each group, and ORDER BY inside OVER() to define the sequence
  • Prefer ROW_NUMBER() when you need a unique identifier (e.g., deduplication), and RANK()/DENSE_RANK() for business ranking
  • Window functions are evaluated after WHERE and GROUP BY, but before the final ORDER BY
← Article précédent : Transactions et ACID ← Previous article: Transactions and ACID Article suivant : La normalisation → Next article: Normalization →
Publicité Advertisement