Générer des séries et des séquences
Créez des lignes avec la récursivité.
Générer des séries et des séquences est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Qu’est-ce qu’une série générée ?
Vous avez parfois besoin d’une liste de nombres, de dates ou d’autres valeurs séquentielles qui n’existent dans aucune table. SQL vous permet de les créer à la volée à l’aide de la récursion ou de fonctions intégrées.
Dans cette leçon, vous apprendrez à générer des séquences avec WITH RECURSIVE — un outil puissant qui permet à une requête de faire référence à son propre résultat.
Votre premier CTE récursif
Un CTE récursif (expression de table commune) comporte deux parties reliées par UNION ALL : un cas de base qui produit la première ligne et une étape récursive qui fait référence au CTE lui-même pour produire la ligne suivante.
La récursion s’arrête lorsque l’étape récursive ne renvoie aucune ligne.
WITH RECURSIVE counter(n) AS (
SELECT 1
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;Comment la récursion se déroule
Il est utile d’imaginer chaque étape séparément. Le cas de base initialise la table, puis chaque passage récursif ajoute une ligne supplémentaire jusqu’à ce que la condition WHERE échoue.
Pour la requête WHERE n < 5, le moteur génère les lignes 1, 2, 3, 4, 5, puis s’arrête, car 5 < 5 est faux.
WITH RECURSIVE steps(n, note) AS (
SELECT 1, 'base case'
UNION ALL
SELECT n + 1, 'recursive step'
FROM steps
WHERE n < 4
)
SELECT n, note FROM steps;Générer des nombres pairs
Vous pouvez modifier la taille du pas en ajoutant simplement une valeur supérieure à 1 dans la partie récursive. Cela produit tous les nombres pairs de 2 à 10.
Le schéma est toujours : valeur_suivante = valeur_actuelle + pas.
WITH RECURSIVE evens(n) AS (
SELECT 2
UNION ALL
SELECT n + 2 FROM evens WHERE n < 10
)
SELECT n FROM evens;Compter à rebours
La récursion ne se limite pas à compter vers le haut. Soustrayez au lieu d’additionner pour obtenir une séquence décroissante. Veillez à ce que la condition d’arrêt utilise > plutôt que < afin d’éviter une boucle infinie.
WITH RECURSIVE countdown(n) AS (
SELECT 10
UNION ALL
SELECT n - 1 FROM countdown WHERE n > 1
)
SELECT n FROM countdown;Générer une plage de dates
L’une des utilisations les plus pratiques des CTE récursifs consiste à construire une série de dates. Vous commencez à partir d’une date précise, puis ajoutez un jour jusqu’à atteindre une date de fin.
C’est particulièrement utile pour combler les lacunes des rapports : chaque date apparaît, même si aucune donnée n’est disponible pour ce jour-là.
WITH RECURSIVE dates(d) AS (
SELECT DATE '2024-01-01'
UNION ALL
SELECT d + INTERVAL '1 day'
FROM dates
WHERE d < DATE '2024-01-07'
)
SELECT d FROM dates;Combler les lacunes des rapports avec une série de dates
Imaginez une table sales qui ne contient des lignes que les jours où des ventes ont eu lieu. En joignant une série de dates générée à la table des ventes avec un LEFT JOIN, vous obtenez chaque jour de la période, avec NULL pour les jours sans vente.
WITH RECURSIVE cal(d) AS (
SELECT DATE '2024-03-01'
UNION ALL
SELECT d + INTERVAL '1 day' FROM cal WHERE d < DATE '2024-03-05'
),
sales(sale_date, amount) AS (
VALUES
(DATE '2024-03-01', 100),
(DATE '2024-03-03', 250),
(DATE '2024-03-05', 180)
)
SELECT cal.d, COALESCE(sales.amount, 0) AS amount
FROM cal
LEFT JOIN sales ON cal.d = sales.sale_date
ORDER BY cal.d;Générer une table de multiplication
Les CTE récursifs peuvent transporter plusieurs colonnes, ce qui vous permet de produire des résultats plus riches. Ici, un indice de ligne et une valeur calculée sont suivis simultanément.
WITH RECURSIVE mult(n, result) AS (
SELECT 1, 1 * 7
UNION ALL
SELECT n + 1, (n + 1) * 7
FROM mult
WHERE n < 10
)
SELECT n, result AS seven_times_n FROM mult;Nombres de Fibonacci
La suite de Fibonacci est une suite classique dans laquelle chaque nombre est la somme des deux précédents : 0, 1, 1, 2, 3, 5, 8 …
Un CTE récursif suit à la fois la valeur actuelle a et la valeur suivante b, puis les permute à chaque étape.
WITH RECURSIVE fib(a, b) AS (
SELECT 0, 1
UNION ALL
SELECT b, a + b FROM fib WHERE a < 100
)
SELECT a AS fibonacci FROM fib;Utiliser generate_series dans PostgreSQL
PostgreSQL propose un raccourci intégré appelé generate_series() qui produit des séquences sans devoir écrire de CTE récursif. Il accepte une valeur de départ, une valeur d’arrêt et un pas facultatif.
C’est la manière la plus concise de générer des plages de nombres ou de dates dans PostgreSQL.
SELECT gs AS num
FROM generate_series(1, 10, 2) AS gs;Générer des intervalles mensuels
Passez un intervalle de '1 month' à generate_series() pour construire un calendrier mensuel. C’est idéal pour créer des en-têtes de rapports mensuels ou vérifier quels mois ne contiennent aucune donnée.
SELECT gs::DATE AS month_start
FROM generate_series(
'2024-01-01'::DATE,
'2024-06-01'::DATE,
INTERVAL '1 month'
) AS gs;Vérification des connaissances
Vérifiez votre compréhension de la génération de séries avec des CTE récursifs.
Récapitulatif : générer des séries et des séquences
Dans cette leçon, vous avez appris à produire des séquences de nombres et de dates sans table source :
- WITH RECURSIVE — un cas de base et une étape récursive reliés par UNION ALL ; la récursion s’arrête lorsque l’étape récursive ne renvoie aucune ligne.
- Taille de pas variable — ajoutez ou soustrayez n’importe quelle valeur pour compter vers le haut, compter à rebours ou ignorer certaines valeurs.
- Plages de dates — ajoutez un intervalle pour générer des séries calendaires quotidiennes, mensuelles ou personnalisées.
- CTE à plusieurs colonnes — transportez un état supplémentaire entre les itérations pour obtenir des résultats plus riches, comme la suite de Fibonacci.
- generate_series() — fonction intégrée de PostgreSQL permettant de produire des séquences de nombres et de dates de manière très concise.
Les séries générées sont essentielles pour combler les lacunes des rapports, créer des données d’essai et gérer toute situation où vous avez besoin d’une plage complète de valeurs, indépendamment du contenu des données.
Questions Fréquemment Posées
La leçon « Générer des séries et des séquences » est-elle gratuite ?
Oui — le texte complet de « Générer des séries et des séquences » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Générer des séries et des séquences » ?
Créez des lignes avec la récursivité. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Générer des séries et des séquences » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Fonctionnement des CTE récursives
- Parcourir un arbre de catégories
- Générer des séries et des séquences
- Éviter les boucles infinies