Générer des séries de nombres et de dates
Utiliser la récursivité pour produire des séquences destinées à combler les lacunes et à créer des calendriers
Générer des séries de nombres et de dates est une leçon SQL Interview Prep 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 Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.
Récursivité sans hiérarchie
Les CTE récursives ne servent pas uniquement à parcourir des arbres. Une autre utilisation majeure consiste à générer des suites : une série de nombres ou chaque date d'un intervalle. Les personnes qui mènent les entretiens posent cette question lorsqu'un problème nécessite de combler les lacunes — c'est-à-dire produire des lignes qui n'existent dans aucune table.
La question classique est la suivante : « Affichez les ventes par jour pour le mois, y compris les jours sans ventes. » Vous ne pouvez pas afficher un jour manquant sans commencer par générer tous les jours.
Une suite simple de nombres
L'ancre initialise le premier nombre ; le membre récursif en ajoute un à chaque itération ; un WHERE dans le membre récursif l'arrête. Cela génère les nombres de 1 à 10.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;Le prédicat d'arrêt
Contrairement à l'organigramme, une suite de nombres ne possède aucune feuille naturelle où s'arrêter — vous pourriez incrémenter indéfiniment. Vous devez donc ajouter une condition d'arrêt explicite dans le membre récursif : WHERE n < 10.
Lorsque n atteint 10, le WHERE de l'itération suivante filtre l'unique ligne candidate, le membre récursif ne renvoie rien et la récursivité s'arrête. Oublier cette protection est la première cause de récursivité incontrôlée lors des entretiens.
Paramétrer l'intervalle
Rendez la suite flexible en déterminant la borne à partir d'une valeur ou d'une variable. Ici, vous générez les nombres de 1 à N, N étant fourni. La même structure permet de produire des suites commençant à 0 ou avec un pas donné — il suffit de modifier l'ancre et l'incrément.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 2 FROM nums WHERE n + 2 <= 99
)
SELECT n FROM nums; -- odd numbers 1,3,5,...,99Générer une suite de dates
Remplacez l'arithmétique entière par l'arithmétique des dates pour obtenir un calendrier. L'ancre est la date de début ; le membre récursif ajoute un jour jusqu'à dépasser la date de fin.
La syntaxe d'ajout d'un jour varie selon le dialecte — cette forme propre à Postgres utilise un intervalle.
WITH RECURSIVE cal AS (
SELECT DATE '2024-01-01' AS d
UNION ALL
SELECT d + INTERVAL '1 day'
FROM cal
WHERE d < DATE '2024-01-31'
)
SELECT d FROM cal;Combler les lacunes avec LEFT JOIN
Combinez maintenant le calendrier avec les données réelles. Générez chaque jour, puis effectuez un LEFT JOIN avec la table des ventes afin que les jours manquants apparaissent avec une valeur NULL que vous transformez en 0 avec COALESCE.
Ce schéma en deux étapes — générer l'axe de référence, puis effectuer une jointure à gauche avec les données — est au cœur de toute réponse visant à combler les lacunes.
WITH RECURSIVE cal AS (
SELECT DATE '2024-01-01' AS d
UNION ALL
SELECT d + INTERVAL '1 day' FROM cal
WHERE d < DATE '2024-01-07'
)
SELECT cal.d, COALESCE(SUM(s.amount), 0) AS total
FROM cal
LEFT JOIN sales s ON s.sale_date = cal.d
GROUP BY cal.d
ORDER BY cal.d;Axes de référence mensuels et hebdomadaires
Modifiez l'incrément pour créer des calendriers plus espacés. Ajoutez INTERVAL '1 month' pour un axe mensuel ou INTERVAL '7 day' pour des semaines. Cette technique est utile lorsqu'une personne qui mène l'entretien demande un rapport par mois incluant les mois sans données.
WITH RECURSIVE months AS (
SELECT DATE '2024-01-01' AS m
UNION ALL
SELECT m + INTERVAL '1 month' FROM months
WHERE m < DATE '2024-12-01'
)
SELECT m FROM months;Différences entre dialectes dans l'arithmétique des dates
L'arithmétique des dates est la partie la moins portable de ces requêtes. Vous devez connaître les variantes :
- Postgres :
d + INTERVAL '1 day'. - MySQL :
DATE_ADD(d, INTERVAL 1 DAY). - SQL Server :
DATEADD(DAY, 1, d). - SQLite :
date(d, '+1 day').
Préciser que la structure récursive est identique et que seule la fonction de traitement des dates change constitue une réponse solide qui tient compte du dialecte.
Récursivité et génération de séries
Postgres fournit une fonction intégrée generate_series() qui produit des nombres ou des dates sans récursivité, et elle est plus rapide et plus claire :
SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');
Si la base de données utilisée lors de l'entretien la prend en charge, privilégiez-la. Mais de nombreux moteurs, notamment MySQL et les versions anciennes de SQL Server, ne la proposent pas — c'est précisément dans ce cas que la CTE récursive constitue une solution de repli portable.
Surveiller la limite de récursivité
La génération d'une grande suite peut atteindre la limite de récursivité du moteur. SQL Server utilise par défaut MAXRECURSION 100 ; un calendrier de 365 jours échoue donc, à moins d'ajouter OPTION (MAXRECURSION 0) pour lever cette limite.
Postgres n'a pas de limite fixe, mais une suite qui s'emballe à cause d'un prédicat incorrect peut continuer jusqu'à épuiser la mémoire. Vérifiez toujours que votre prédicat d'arrêt est correct avant de passer à une plus grande échelle.
-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);Effectuer un CROSS JOIN avec la suite
Une suite générée n'est souvent qu'un composant. Une fois que vous disposez d'une CTE de nombres, effectuez un CROSS JOIN avec celle-ci pour étendre ou démultiplier des lignes — par exemple, pour répéter chaque ligne de commande selon sa quantité ou pour décliner un intervalle de dates pour chaque client.
Comprendre que la récursivité produit un composant réutilisable, et pas seulement une réponse finale, est ce qui distingue une réponse d'entretien soignée d'une réponse apprise par cœur.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT o.order_id, nums.n AS unit
FROM orders o
JOIN nums ON nums.n <= o.quantity;Vérification rapide
Pourquoi le prédicat d'arrêt est-il essentiel dans une suite de nombres ou de dates ?
Récapitulatif
La récursivité peut fabriquer des lignes qui n'existent dans aucune table :
- Initialisez la première valeur dans l'ancre et incrémentez-la dans le membre récursif.
- Ajoutez toujours un prédicat d'arrêt explicite — les suites n'ont pas de fin naturelle.
- Construisez un axe de référence de dates ou de nombres, puis utilisez
LEFT JOINavec les données etCOALESCEpour combler les lacunes. - Privilégiez
generate_serieslorsqu'il est disponible et faites attention àMAXRECURSIONavec SQL Server.
Ensuite : les techniques de sécurité qui empêchent la récursivité de s'emballer.
Questions Fréquemment Posées
La leçon « Générer des séries de nombres et de dates » est-elle gratuite ?
Oui — le texte complet de « Générer des séries de nombres et de dates » 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 Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Générer des séries de nombres et de dates » ?
Utiliser la récursivité pour produire des séquences destinées à combler les lacunes et à créer des calendriers Tu pratiques SQL Interview Prep 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 Interview Prep ?
Aucune expérience préalable n'est requise. SQL Interview Prep 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 de nombres et de dates » ?
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 Interview Prep ?
Oui. Chaque leçon SQL Interview Prep 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
- Membres d’ancrage et membres récursifs
- Parcourir un organigramme
- Générer des séries de nombres et de dates
- Éviter la récursivité infinie