SELECT * FROM mv_ca_mensuel ORDERBY mois DESCLIMIT ;
41-requetes-sql-entretien · 35
BLOC 5 — CTE et requêtes récursives
Requête 36 — CTE simple : lisibilité et réutilisation
Contexte d’entretien : “Réécris cette requête imbriquée avec des CTE.”
WITH
users_actifs AS (
SELECT id, nom, email
FROM users
WHERE statut = 'actif'AND created_at > '2023-01-01'
),
commandes_recentes AS (
SELECT user_id, COUNT(*) AS nb, SUM(montant) AS ca
FROM orders
WHERE created_at > '2024-01-01'
GROUPBY user_id
)
SELECT
u.nom,
u.email,
COALESCE(c.nb, ) AS nb_commandes,
COALESCE(c.ca, ) AS ca_total
FROM users_actifs u
LEFTJOIN commandes_recentes c ON u.id = c.user_id
ORDERBY ca_total DESC;
41-requetes-sql-entretien · 36
Requête 37 — CTE récursive : parcourir une hiérarchie
Contexte d’entretien : “Affiche l’arborescence complète d’une organisation.”
WITH RECURSIVE hierarchie AS (
-- Ancre : le PDG (pas de manager)
SELECT id, nom, manager_id, AS niveau, nom AS chemin
FROM employes
WHERE manager_id ISNULL
UNIONALL
-- Récursion : les subordonnés
SELECT e.id, e.nom, e.manager_id,
h.niveau + ,
h.chemin || ' > ' || e.nom
FROM employes e
JOIN hierarchie h ON e.manager_id = h.id
)
SELECT
REPEAT(' ', niveau) || nom AS arbre,
niveau,
chemin
FROM hierarchie
ORDERBY chemin;
41-requetes-sql-entretien · 37
Requête 38 — CTE récursive : générer une série de dates
Contexte d’entretien : “Génère un calendrier de dates pour un rapport sans trous.”
WITH RECURSIVE calendrier AS (
SELECT'2024-01-01'::DATEAS jour
UNIONALL
SELECT jour + INTERVAL '1 day'
FROM calendrier
WHERE jour < '2024-12-31'
)
-- LEFT JOIN pour inclure les jours sans ventes
SELECT c.jour, COALESCE(SUM(o.montant), ) AS ca
FROM calendrier c
LEFTJOIN orders o ON DATE_TRUNC('day', o.created_at) = c.jour
GROUPBY c.jour
ORDERBY c.jour;
41-requetes-sql-entretien · 38
💡 En PostgreSQL, utilisez plutôt generate_series('2024-01-01'::DATE, '2024-12-31'::DATE, '1 day') pour les séries simples. Les CTE récursives restent utiles pour les hiérarchies.
Requête 39 — CTE récursive : calcul de factorielle et suites
Contexte d’entretien : “Implémente la suite de Fibonacci en SQL.”
WITH RECURSIVE fibonacci AS (
SELECTAS n, AS a, AS b
UNIONALL
SELECT n + , b, a + b
FROM fibonacci
WHERE n <
)
SELECT n, a AS valeur
FROM fibonacci;
41-requetes-sql-entretien · 39
Requête 40 — CTE pour détecter des cycles dans un graphe
Contexte d’entretien : “Détecte les références circulaires dans une table parent-enfant.”
WITH RECURSIVE chemins AS (
SELECT id, manager_id, ARRAY[id] AS visites, falseAS cycle
FROM employes
WHERE manager_id ISNULL
UNIONALL
SELECT e.id, e.manager_id,
c.visites || e.id,
e.id = ANY(c.visites) -- détection du cycle
FROM employes e
JOIN chemins c ON e.manager_id = c.id
WHERENOT c.cycle
)
SELECT id, visites AS chemin
FROM chemins
WHERE cycle = true;
41-requetes-sql-entretien · 40
Requête 41 — CTE + Window Function : rapport complet en une requête
Contexte d’entretien : “La question finale des entretiens senior.”
Construire un rapport complet : CA par mois, variation vs mois précédent, rang dans l’année, cumul YTD.
WITH ca_mensuel AS (
SELECT
DATE_TRUNC('month', created_at) AS mois,
SUM(montant) AS ca
FROM orders
WHERE created_at >= DATE_TRUNC('year', NOW())
GROUPBY
),
ca_avec_comparaison AS (
SELECT
mois,
ca,
LAG(ca) OVER (ORDERBY mois) AS ca_mois_precedent
FROM ca_mensuel
)
SELECT
TO_CHAR(mois, 'Mon YYYY') AS mois,
ca,
ca_mois_precedent,
ca - ca_mois_precedent AS variation,
ROUND(. * (ca - ca_mois_precedent)
/ NULLIF(ca_mois_precedent, ), ) AS variation_pct,
RANK() OVER (ORDERBY ca DESC) AS rang_ca,
SUM(ca) OVER (ORDERBY mois ROWS UNBOUNDED PRECEDING) AS cumul_ytd
FROM ca_avec_comparaison
ORDERBY mois;
41-requetes-sql-entretien · 41
📋 Récapitulatif des 41 requêtes
#
Requête
Bloc
Fréquence entretien
1
ROW_NUMBER — top 1 par groupe
Fenêtres
⭐⭐⭐⭐⭐
2
RANK vs DENSE_RANK
Fenêtres
⭐⭐⭐⭐⭐
3
LAG / LEAD — variation M/M
Fenêtres
⭐⭐⭐⭐⭐
4
SUM cumulatif (running total)
Fenêtres
⭐⭐⭐⭐
5
Moyenne mobile N jours
Fenêtres
⭐⭐⭐⭐
6
NTILE — quartiles
Fenêtres
⭐⭐⭐
7
FIRST_VALUE / LAST_VALUE
Fenêtres
⭐⭐⭐
8
PERCENT_RANK / CUME_DIST
Fenêtres
⭐⭐
9
Détection de gaps
Fenêtres
⭐⭐⭐
10
Sessionisation
Fenêtres
⭐⭐⭐⭐
11
Top N par catégorie
Fenêtres
⭐⭐⭐⭐⭐
12
Médiane avec PERCENTILE_CONT
Fenêtres
⭐⭐⭐
13
SELF JOIN — manager vs employé
Jointures
⭐⭐⭐⭐
14
Lignes sans correspondance
Jointures
⭐⭐⭐⭐⭐
15
CROSS JOIN — combinaisons
Jointures
⭐⭐
16
JOIN multi-conditions (dates)
Jointures
⭐⭐⭐⭐
17
UNION vs UNION ALL
Jointures
⭐⭐⭐⭐
18
Piège multiplication de lignes
Jointures
⭐⭐⭐⭐⭐
19
LATERAL JOIN
Jointures
⭐⭐⭐
20
Déduplication avec JOIN
Jointures
⭐⭐⭐⭐
21
SUM/COUNT avec CASE WHEN
Agrégations
⭐⭐⭐⭐⭐
22
Syntaxe FILTER
Agrégations
⭐⭐⭐
23
Pivot manuel
Agrégations
⭐⭐⭐⭐
24
Taux de rétention cohorte
Agrégations
⭐⭐⭐⭐⭐
25
JSON / ARRAY — JSONB
Agrégations
⭐⭐⭐
26
GROUP BY ROLLUP
Agrégations
⭐⭐⭐
27
GROUP BY CUBE
Agrégations
⭐⭐
28
STRING_AGG
Agrégations
⭐⭐⭐
29
Lire EXPLAIN ANALYZE
Optimisation
⭐⭐⭐⭐⭐
30
Index composite couvrant
Optimisation
⭐⭐⭐⭐
31
Sous-requête → JOIN
Optimisation
⭐⭐⭐⭐
32
Fonction sur colonne indexée
Optimisation
⭐⭐⭐⭐
33
ANALYZE — statistiques
Optimisation
⭐⭐⭐
34
Partitionnement
Optimisation
⭐⭐⭐
35
Materialized View
Optimisation
⭐⭐⭐⭐
36
CTE simple — lisibilité
CTE
⭐⭐⭐⭐⭐
37
CTE récursive — hiérarchie
CTE
⭐⭐⭐⭐⭐
38
CTE récursive — série dates
CTE
⭐⭐⭐⭐
39
CTE récursive — Fibonacci
CTE
⭐⭐
40
Détection de cycles
CTE
⭐⭐⭐
41
Rapport complet CTE + Window
CTE
⭐⭐⭐⭐⭐
✅ Checklist de préparation entretien
☐ Je sais expliquer la différence RANK / DENSE_RANK / ROW_NUMBER
☐ Je sais écrire un running total et une moyenne mobile
☐ Je connais les pièges de NOT IN avec des NULL
☐ Je sais réécrire une sous-requête corrélée en JOIN
☐ Je sais lire un plan EXPLAIN ANALYZE
☐ Je peux écrire une CTE récursive pour une hiérarchie
☐ Je connais la différence WHERE / HAVING
☐ Je sais créer un index composite et couvrant
☐ Je connais UNION vs UNION ALL et leurs impacts perfs
☐ Je peux construire un rapport CA mensuel avec LAG + SUM cumulatif
🚀 Où s’entraîner — La plateforme recommandée
⭐ Modai Lab — La plateforme pour pratiquer le SQL data
modai-lab.com · La référence pour s’entraîner sur des cas réels orientés data
Modai Lab est la plateforme pensée spécifiquement pour les profils data qui veulent progresser en SQL sur des exercices concrets, pas théoriques.
Ce que vous trouverez sur Modai Lab :
Exercices SQL classés par niveau et par thème (fenêtres, CTE, optimisation…)
Des datasets réalistes qui reproduisent les cas en entreprise
Un feedback immédiat sur vos requêtes avec explication des erreurs
Des parcours orientés entretien pour préparer efficacement
Une communauté active pour poser vos questions
Pourquoi Modai Lab plutôt que les alternatives :
Plateforme
Points forts
Limite
Modai Lab ⭐
Cas data réels, feedback immédiat, parcours entretien
—
pgexercises.com
Exercices PostgreSQL classiques
Peu orienté data
LeetCode SQL
Grand catalogue
Contexte data limité
Mode Analytics
Tutoriels analytiques
Pas d’exercices interactifs
💡 Recommandation : Lisez ce guide une fois, puis allez pratiquer chaque pattern sur Modai Lab. C’est en écrivant les requêtes vous-même que vous les retenez vraiment.
📚 Ressources complémentaires
explain.dalibo.com — Visualisation de plans d’exécution PostgreSQL
use-the-index-luke.com — Guide complet sur les index SQL
SQL Performance Explained — Markus Winand (livre)
Guide offert suite au post LinkedIn · Entraînez-vous sur Modai Lab · Partagez librement ♻️
Modai Lab
La théorie c’est bien. La pratique sur des cas concrets, c’est mieux.
Exerce-toi sur les cas SQL qu’on te posera en entretien, avec un coach IA qui review chaque requête comme un senior. Essai gratuit, sans carte bancaire.