CodeGym /Cours /SQL SELF /Comparaison des fonctions window avec les fonctions agrég...

Comparaison des fonctions window avec les fonctions agrégées : GROUP BY vs PARTITION BY

SQL SELF
Niveau 30 , Leçon 0
Disponible

À première vue, les fonctions window et les fonctions agrégées semblent être des outils similaires pour analyser et manipuler des données. Les deux font des calculs comme la somme, la moyenne, le ranking, etc. Mais voyons en quoi elles diffèrent vraiment.

Fonctions agrégées (GROUP BY)

Les fonctions agrégées bossent comme ça :

  • Elles regroupent les lignes selon les colonnes que tu indiques.
  • Après le groupement, chaque groupe devient une seule ligne dans le résultat.
  • Exemple : tu veux connaître le revenu total par région.
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;

Particularité : GROUP BY "compresse" les données. Si tu utilises un groupement, toutes les lignes d’un même groupe disparaissent — il ne reste que le résultat de l’agrégation.

Fonctions window (PARTITION BY)

Les fonctions window, au contraire :

  • Gardent la structure originale des données (pas de compression ni de disparition de lignes !).
  • Peuvent faire des calculs à l’intérieur de "fenêtres" — des groupes logiques de lignes.

Exemple : tu veux connaître la part des ventes de chaque ville dans le total des ventes de sa région, mais tu veux garder toutes les données.

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales_by_region
FROM sales_data;

Particularité : utiliser les fonctions window ne supprime pas les lignes, ça ajoute juste de nouvelles valeurs calculées à chaque ligne.

Exemple : SUM() avec GROUP BY vs SUM() avec PARTITION BY

Pour mieux piger la différence, voyons comment SUM() marche dans les deux cas. Imaginons qu’on a une table sales_data comme ça :

region city sales
North CityA 100
North CityB 150
South CityC 200
South CityD 250

Somme avec GROUP BY

On veut connaître le total des ventes par région :

SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;

Le résultat sera comme ça :

region total_sales
North 250
South 450

Ce qui s’est passé : les lignes ont été groupées par region, et chaque groupe a été "compressé" en une seule ligne avec la somme des ventes.

Somme avec PARTITION BY

Maintenant, faisons la même chose avec une fonction window :

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales_by_region
FROM sales_data;

Résultat :

region city sales total_sales_by_region
North CityA 100 250
North CityB 150 250
South CityC 200 450
South CityD 250 450

Ce qui s’est passé : PARTITION BY n’a pas "compressé" les lignes. Il a juste fait le calcul de la somme dans chaque fenêtre (chaque région = une fenêtre séparée).

Quand utiliser GROUP BY et quand PARTITION BY ?

GROUP BY : parfait pour les rapports finaux

GROUP BY est utile quand tu veux réduire la quantité de données et obtenir des résultats finaux au niveau des groupes. Par exemple :

  • Ventes totales par mois.
  • Compter le nombre de commandes par catégorie de produits.

Exemple :

SELECT category, COUNT(*) AS total_orders
FROM orders
GROUP BY category;

PARTITION BY : idéal pour l’analyse détaillée

PARTITION BY est top quand tu veux garder toutes les lignes et calculer des trucs en plus pour chacune. Par exemple :

  • Déterminer la part des ventes de chaque produit dans sa catégorie.
  • Numéroter les lignes à l’intérieur de chaque groupe.

Exemple de calcul de part de ventes :

SELECT
    category,
    product,
    sales,
    ROUND(
        (sales * 100.0) / SUM(sales) OVER (PARTITION BY category),
        2
    ) AS sales_percentage
FROM sales_data;

Exemple : utiliser plusieurs fonctions window

Un des gros avantages des fonctions window, c’est que tu peux faire plusieurs calculs d’un coup. Par exemple :

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales,
    RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS sales_rank
FROM sales_data;

Résultat :

region city sales total_sales sales_rank
North CityB 150 250 1
North CityA 100 250 2
South CityD 250 450 1
South CityC 200 450 2

Avantages des fonctions window sur GROUP BY

Préservation des données originales : GROUP BY "compresse" les lignes, alors que les fonctions window gardent la structure originale de la table.

Plusieurs calculs dans une seule requête : Tu peux utiliser plusieurs fonctions window avec différents paramètres PARTITION BY et ORDER BY, tout en gardant les données.

Analyse flexible : Les fonctions window te permettent de faire des calculs sur-mesure : sommes cumulées, ranking, parts, et plein d’autres trucs.

Exemple de flexibilité

Essayons de combiner plusieurs fonctions :

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales,
    AVG(sales) OVER (PARTITION BY region) AS avg_sales,
    RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS rank
FROM sales_data;

Résultat :

region city sales total_sales avg_sales rank
North CityB 150 250 125.0 1
North CityA 100 250 125.0 2
South CityD 250 450 225.0 1
South CityC 200 450 225.0 2

Limitations et erreurs classiques

Une erreur fréquente, c’est d’essayer d’utiliser PARTITION BY quand il faut "compresser" les données. Par exemple, au lieu de :

SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;

Certains essaient d’écrire ça :

SELECT
    region,
    SUM(sales) OVER (PARTITION BY region) AS total_sales
FROM sales_data;

Mais ça va renvoyer toutes les lignes, sans réduire la quantité de données (ce qui n’est pas toujours ce qu’on veut).

Maintenant tu sais exactement quand utiliser GROUP BY et quand utiliser les fonctions window. C’est un peu comme choisir entre un marteau et un tournevis : les deux bossent avec des clous... mais pas pareil.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION