N filas consecutivas que cumplen una condición
El patrón clásico de ventana de «tres días consecutivos con ventas superiores a X».
N filas consecutivas que cumplen una condición es una lección gratuita de SQL 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 SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.
Un clásico de LeetCode
Este es uno de los problemas de SQL más frecuentes en las entrevistas: "Encuentre todas las fechas con al menos tres días consecutivos en los que las ventas superaron un umbral", o el conocido ejercicio de LeetCode: "muestre el estadio con 3 o más filas consecutivas de asistencia superior a 100".
La estructura siempre es la misma: una fila solo cumple si forma parte de una secuencia de N filas consecutivas que cumplen la condición. En esta lección se muestran dos soluciones claras y la trampa en la que cae la mayoría de los candidatos.
Los datos de ejemplo
Usaremos una tabla diaria sales. La condición es amount > 100. Debemos devolver todos los días que pertenezcan a una secuencia de 3 o más días naturales consecutivos que cumplan la condición.
sale_date— una fila por díaamount— ventas totales de ese día
Matiz importante: las filas deben ser consecutivas en la secuencia y, en las versiones basadas en fechas, también consecutivas en el calendario.
SELECT * FROM sales ORDER BY sale_date;
-- sale_date | amount
-- 2024-03-01 | 120
-- 2024-03-02 | 150
-- 2024-03-03 | 130
-- 2024-03-04 | 90
-- 2024-03-05 | 200Enfoque 1: filtrar y después crear islas
El enfoque más sólido consiste en conservar primero solo las filas que cumplen la condición, agrupar después las filas restantes en islas consecutivas y, por último, conservar las islas cuya longitud sea al menos N.
El primer paso es el filtro WHERE. En el segundo se reutiliza el ancla de brechas e islas. Como filtramos primero, aquí una isla significa "una secuencia de días consecutivos que cumplen la condición".
WITH qualifying AS (
SELECT sale_date
FROM sales
WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;Anclaje de las secuencias que cumplen la condición
Numere las filas que cumplen la condición por fecha y haga una resta para obtener el ancla de la isla. Las filas que sean consecutivas en el calendario y que además cumplan todas la condición compartirán un ancla; cualquier día que no cumpla fue eliminado, por lo que la secuencia se interrumpe exactamente donde debe.
WITH qualifying AS (
SELECT sale_date
FROM sales
WHERE amount > 100
),
numbered AS (
SELECT sale_date,
ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
FROM qualifying
)
SELECT sale_date, sale_date - rn AS grp
FROM numbered;Conservar las islas suficientemente largas
Agrupe por el ancla, cuente las filas y conserve solo los grupos con COUNT(*) >= 3. Si el entrevistador quiere recuperar las fechas individuales que cumplen la condición, una las anclas conservadas con las filas numeradas.
WITH qualifying AS (
SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
SELECT sale_date,
ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
FROM qualifying
),
islands AS (
SELECT sale_date - rn AS grp, COUNT(*) AS len
FROM numbered
GROUP BY sale_date - rn
HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;Enfoque 2: ventana móvil con COUNT
Un enfoque más elegante cuando N es pequeño y fijo consiste en usar un marco de ventana para contar cuántas filas circundantes también cumplen la condición. Si alguna ventana de N filas consecutivas que contiene esta fila cumple la condición en todas sus filas, la fila forma parte de la respuesta.
Primero añada un indicador booleano y, después, sume ese indicador sobre marcos deslizantes.
SELECT sale_date, amount,
CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;Sumar sobre tres marcos
Para una secuencia de exactamente 3 filas, una fila que cumple la condición forma parte de la respuesta si la ventana de 3 filas que termina en ella, que está centrada en ella o que comienza en ella suma 3. Calcule las tres sumas móviles y compruebe si alguna es igual a 3.
Esta es la técnica utilizada en la solución de LeetCode 601 (Human Traffic of Stadium).
WITH flagged AS (
SELECT sale_date, amount,
CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales
),
w AS (
SELECT *,
SUM(ok) OVER (ORDER BY sale_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS s_end,
SUM(ok) OVER (ORDER BY sale_date
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS s_mid,
SUM(ok) OVER (ORDER BY sale_date
ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS s_start
FROM flagged
)
SELECT sale_date, amount
FROM w
WHERE ok = 1 AND (s_end = 3 OR s_mid = 3 OR s_start = 3);La trampa de los intervalos del calendario
El enfoque de suma sobre ventanas usa ROWS, que cuenta filas de resultado adyacentes, no días consecutivos del calendario. Si ya se eliminó un día que no cumple la condición, dos filas pueden ser adyacentes en el resultado sin ser consecutivas en el calendario.
Lección: aplique la ventana deslizante a la serie diaria completa (no filtre previamente) o use el método del ancla de fecha, que respeta de forma inherente las brechas del calendario. Mencione esta contrapartida en la entrevista.
Generalización para cualquier N
El enfoque 1 (filtrar y después crear islas) se generaliza de forma trivial: basta con cambiar HAVING COUNT(*) >= N. Esa es su gran ventaja frente a la suma de varias ventanas, que necesita más marcos a medida que aumenta N.
Para un valor de N parametrizado o grande, prefiera el método de islas — solo requiere cambiar un umbral en lugar de escribir manualmente N−1 ventanas.
-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5Elegir un enfoque
Una guía rápida para explicar en voz alta:
- Filtrar y después crear islas: respeta las brechas del calendario, se generaliza para cualquier N y devuelve las secuencias completas — es la opción predeterminada más segura.
- Suma con ventana deslizante: es elegante para un N pequeño y fijo sobre una serie diaria densa, pero debe prestar atención a la trampa de ROWS frente al calendario.
Mencionar ambos enfoques y justificar su elección es exactamente lo que valoran los entrevistadores de nivel intermedio o sénior.
Solución completa
La respuesta portable para cualquier N, que respeta la consecutividad del calendario y devuelve las fechas que cumplen la condición:
WITH qualifying AS (
SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
SELECT sale_date,
ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
FROM qualifying
),
islands AS (
SELECT sale_date - rn AS grp, COUNT(*) AS len
FROM numbered
GROUP BY sale_date - rn
HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;Comprobación rápida
Detecte el error sutil.
Resumen
Para N filas consecutivas que cumplen una condición:
- Filtrar y después crear islas: conserve las filas que cumplen la condición, cree el ancla con
date - ROW_NUMBER(), agrupe y useHAVING COUNT(*) >= N. Se generaliza y respeta las brechas del calendario. - Suma con ventana deslizante: marque las filas y sume sobre marcos fijos de N filas; es elegante, pero tenga cuidado con la diferencia entre ROWS y el calendario cuando trabaje con datos filtrados previamente.
A continuación: calcular la racha activa actual de un usuario hasta hoy.
Preguntas frecuentes
¿La lección «N filas consecutivas que cumplen una condición» es gratis?
Sí — el texto completo de «N filas consecutivas que cumplen una condición» 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 SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «N filas consecutivas que cumplen una condición»?
El patrón clásico de ventana de «tres días consecutivos con ventas superiores a X». Practicas SQL 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 SQL Interview Prep?
No se requiere experiencia previa. SQL 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 «N filas consecutivas que cumplen una condición»?
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 SQL Interview Prep?
Sí. Cada lección de SQL 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
- Detectar días consecutivos del calendario
- Racha más larga por usuario
- N filas consecutivas que cumplen una condición
- Racha activa actual hasta hoy