Maintenant, t'es prêt à plonger dans le monde des exemples pratiques pour voir comment tout ça marche sur des vrais cas !
Exemple : calcul du rang des ventes par région
Imaginons qu'on a une table sales qui contient des infos sur les ventes dans différentes régions. On doit déterminer le rang des ventes pour chaque région.
| id | region | sales_amount |
|---|---|---|
| 1 | North | 5000 |
| 2 | North | 3000 |
| 3 | North | 7000 |
| 4 | South | 2000 |
| 5 | South | 4000 |
| 6 | East | 8000 |
| 7 | East | 6000 |
Objectif : trouver le rang (RANK) des ventes pour chaque région
SELECT
region,
sales_amount,
RANK() OVER (PARTITION BY region ORDER BY sales_amount DESC) AS sales_rank
FROM
sales;
Résultat :
| region | sales_amount | sales_rank |
|---|---|---|
| North | 7000 | 1 |
| North | 5000 | 2 |
| North | 3000 | 3 |
| South | 4000 | 1 |
| South | 2000 | 2 |
| East | 8000 | 1 |
| East | 6000 | 2 |
Fais gaffe, on a utilisé PARTITION BY region pour calculer les rangs séparément pour chaque région. Si on n'avait pas mis PARTITION BY, le rang aurait été calculé globalement sur toute la table.
Exemple : calcul de la somme cumulée du revenu
Maintenant, on va bosser sur la table transactions pour calculer la somme cumulée du revenu pour chaque client.
| id | customer_id | purchase_date | amount |
|---|---|---|---|
| 1 | 101 | 2023-01-01 | 100 |
| 2 | 101 | 2023-01-03 | 50 |
| 3 | 102 | 2023-01-02 | 200 |
| 4 | 101 | 2023-01-05 | 150 |
| 5 | 102 | 2023-01-04 | 100 |
Objectif : calculer la somme cumulée pour chaque client
SELECT
customer_id,
purchase_date,
amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY purchase_date) AS cumulative_sum
FROM
transactions;
Résultat :
| customer_id | purchase_date | amount | cumulative_sum |
|---|---|---|---|
| 101 | 2023-01-01 | 100 | 100 |
| 101 | 2023-01-03 | 50 | 150 |
| 101 | 2023-01-05 | 150 | 300 |
| 102 | 2023-01-02 | 200 | 200 |
| 102 | 2023-01-04 | 100 | 300 |
Ici, le truc important c'est d'utiliser ORDER BY purchase_date dans OVER() pour que la somme cumulée soit calculée dans l'ordre chronologique.
Exemple : découpage des données en quantiles
Imagine qu'on a une table students avec les noms et les résultats des tests. On veut diviser les élèves en 4 groupes selon leurs scores.
| id | name | test_score |
|---|---|---|
| 1 | Alice | 85 |
| 2 | Bob | 95 |
| 3 | Charlie | 75 |
| 4 | Diana | 88 |
| 5 | Edward | 65 |
| 6 | Fiona | 70 |
Objectif : diviser les étudiants en 4 groupes avec NTILE()
SELECT
name,
test_score,
NTILE(4) OVER (ORDER BY test_score DESC) AS quartile
FROM
students;
Le résultat de la requête sera comme ça :
| name | test_score | quartile |
|---|---|---|
| Bob | 95 | 1 |
| Diana | 88 | 1 |
| Alice | 85 | 2 |
| Charlie | 75 | 3 |
| Fiona | 70 | 3 |
| Edward | 65 | 4 |
NTILE(4) découpe les données en 4 groupes. Les élèves avec les meilleurs scores sont dans le premier groupe, ceux avec les plus faibles dans le dernier.
Exemple : analyse de données temporelles
Dans la table site_visits, on a des infos sur le nombre de visites par jour pour chaque site. On doit calculer la différence de visites entre les jours pour chaque site.
| site_id | visit_date | visits |
|---|---|---|
| 1 | 2023-01-01 | 100 |
| 1 | 2023-01-02 | 120 |
| 1 | 2023-01-03 | 110 |
| 2 | 2023-01-01 | 50 |
| 2 | 2023-01-02 | 60 |
| 2 | 2023-01-03 | 70 |
Notre objectif — calculer la différence de visites entre les jours
SELECT
site_id,
visit_date,
visits,
visits - LAG(visits) OVER (PARTITION BY site_id ORDER BY visit_date) AS visit_diff
FROM
site_visits;
Résultat :
| site_id | visit_date | visits | visit_diff |
|---|---|---|---|
| 1 | 2023-01-01 | 100 | NULL |
| 1 | 2023-01-02 | 120 | 20 |
| 1 | 2023-01-03 | 110 | -10 |
| 2 | 2023-01-01 | 50 | NULL |
| 2 | 2023-01-02 | 60 | 10 |
| 2 | 2023-01-03 | 70 | 10 |
La fonction LAG() permet de choper la valeur de la ligne précédente. Si y'a pas de donnée pour la ligne précédente, le résultat sera NULL. Tu verras plus de détails là-dessus dans les prochaines leçons :P
GO TO FULL VERSION