Generar series de números y fechas
Use la recursividad para generar secuencias destinadas a completar huecos y crear calendarios
Generar series de números y fechas es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.
Recursión sin una jerarquía
Las CTE recursivas no sirven únicamente para los árboles. Otro uso importante es generar secuencias: una serie de números o todas las fechas de un intervalo. Los entrevistadores suelen preguntar por esto cuando un problema requiere rellenar huecos: producir filas que no existen en ninguna tabla.
La pregunta clásica es: «Muestre las ventas de cada día del mes, incluidos los días sin ventas». No puede mostrar un día ausente si antes no genera todos los días.
Una serie sencilla de números
La ancla establece el primer número; el miembro recursivo suma uno en cada iteración; un WHERE en el miembro recursivo detiene el proceso. Esto genera los números del 1 al 10.
WITH RECURSIVE nums AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM nums WHERE n < 10
)
SELECT n FROM nums;El predicado de terminación
A diferencia del organigrama, una serie de números no tiene una hoja natural en la que detenerse: podría incrementarla indefinidamente. Por eso debe añadir una condición de detención explícita en el miembro recursivo: WHERE n < 10.
Cuando n llega a 10, el WHERE de la siguiente iteración filtra la única fila candidata, el miembro recursivo no devuelve ninguna fila y la recursión se detiene. Olvidar esta protección es la causa principal de la recursión descontrolada en las entrevistas.
Parametrizar el intervalo
Haga que la serie sea flexible obteniendo el límite de un valor o una variable. Aquí se generan los números del 1 al N, donde se proporciona N. La misma estructura permite generar series que comiencen en 0 o que avancen en pasos: solo tiene que cambiar la ancla y el incremento.
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,...,99Generar una serie de fechas
Sustituya las operaciones con enteros por operaciones con fechas y obtendrá un calendario. La ancla es la fecha inicial; el miembro recursivo añade un día hasta superar la fecha final.
La sintaxis para añadir un día varía según el dialecto: esta forma, propia de Postgres, utiliza un intervalo.
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;Rellenar huecos con un LEFT JOIN
Ahora combine el calendario con los datos reales. Genere todos los días y, después, haga un LEFT JOIN con la tabla de ventas para que los días ausentes aparezcan con un NULL, que convertirá en 0 mediante COALESCE.
Este patrón de dos pasos —generar el eje y después combinarlo por la izquierda con los hechos— es la base de cualquier solución para rellenar huecos.
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;Ejes mensuales y semanales
Cambie el incremento para crear calendarios con intervalos más amplios. Añada INTERVAL '1 month' para un eje mensual o INTERVAL '7 day' para semanas. Resulta útil cuando el entrevistador solicita un informe mensual que incluya los meses vacíos.
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;Diferencias entre dialectos en las operaciones con fechas
La aritmética de fechas es la parte menos portable de estas consultas. Conozca las variantes:
- Postgres:
d + INTERVAL '1 day'. - MySQL:
DATE_ADD(d, INTERVAL 1 DAY). - SQL Server:
DATEADD(DAY, 1, d). - SQLite:
date(d, '+1 day').
Mencionar que la estructura de la recursión es idéntica y que solo cambia la función de fecha demuestra un buen dominio del dialecto.
Recursión frente a generate_series
Postgres incluye generate_series(), una función integrada que genera números o fechas sin recurrencia, y que resulta más rápida y clara:
SELECT generate_series(DATE '2024-01-01', DATE '2024-01-31', INTERVAL '1 day');
Si la base de datos del entrevistador la admite, es preferible utilizarla. Sin embargo, muchos motores (MySQL y SQL Server antes de sus versiones recientes) no la incluyen; precisamente en esos casos la CTE recursiva es la alternativa portable.
Vigile el límite de recursión
Generar una serie grande puede alcanzar el límite de recursión del motor. SQL Server tiene MAXRECURSION 100 de forma predeterminada, por lo que un calendario de 365 días falla a menos que añada OPTION (MAXRECURSION 0) para eliminar el límite.
Postgres no tiene un límite fijo, pero una serie descontrolada debido a un predicado incorrecto puede ejecutarse hasta agotar la memoria. Confirme siempre que el predicado de terminación sea correcto antes de aumentar la escala.
-- SQL Server: lift the 100-row recursion cap
-- ...recursive CTE here...
SELECT * FROM cal
OPTION (MAXRECURSION 0);Combinar la serie mediante CROSS JOIN
Una serie generada suele ser solo un ingrediente. Cuando tenga una CTE de números, utilice CROSS JOIN para ampliar o descomponer filas; por ejemplo, para repetir cada fila de pedido según su cantidad o para distribuir un intervalo de fechas por cliente.
Reconocer que la recursión produce un bloque de construcción reutilizable, y no solo una respuesta final, es lo que distingue una respuesta pulida en una entrevista de una respuesta memorizada.
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;Comprobación rápida
¿Por qué es fundamental el predicado de detención en una serie de números o fechas?
Repaso
La recursión puede generar filas que no existen en ninguna tabla:
- Establezca el primer valor en la ancla e increméntelo en el miembro recursivo.
- Añada siempre un predicado de terminación explícito: las series no tienen un final natural.
- Construya un eje de fechas o números y, después, haga un
LEFT JOINcon los hechos y useCOALESCEpara rellenar huecos. - Prefiera
generate_seriescuando esté disponible y tenga en cuentaMAXRECURSIONen SQL Server.
A continuación: las técnicas de seguridad que evitan que la recursión se descontrole.
Preguntas frecuentes
¿La lección «Generar series de números y fechas» es gratis?
Sí — el texto completo de «Generar series de números y fechas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Generar series de números y fechas»?
Use la recursividad para generar secuencias destinadas a completar huecos y crear calendarios Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Coding Interview Prep?
No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Generar series de números y fechas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?
Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Miembros ancla y recursivos
- Recorrer un organigrama
- Generar series de números y fechas
- Evitar la recursividad infinita