Medias móviles en una ventana deslizante
Calcule medias móviles de N periodos con BETWEEN PRECEDING AND CURRENT ROW
Medias móviles en una ventana deslizante 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.
La pregunta sobre el promedio móvil
A los analistas les hacen esta pregunta constantemente: "Calcule un promedio móvil de 7 días de los ingresos." Un promedio móvil (o deslizante) suaviza los datos diarios ruidosos al promediar cada punto con sus vecinos recientes.
La respuesta adecuada para una entrevista es un AVG de ventana con un marco deslizante explícito. La habilidad clave consiste en elegir los límites del marco para que la ventana se desplace correctamente siguiendo el orden.
El patrón básico
Un promedio móvil es AVG(value) OVER (ORDER BY ... ROWS BETWEEN n PRECEDING AND CURRENT ROW). El marco se desliza: en cada fila abarca la fila actual y las n filas anteriores.
Para una ventana de 7 días sobre filas diarias, debe retroceder 6 filas además de incluir la actual, lo que da un total de 7 filas. Este error de uno es el fallo más habitual que detectan los entrevistadores.
SELECT
sale_date,
amount,
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS moving_avg_7d
FROM daily_sales;Cálculo correcto del tamaño de la ventana
El tamaño de la ventana es igual a preceding + 1 (el +1 corresponde a la fila actual). Por tanto:
- Ventana de 3 filas:
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW - Ventana de 7 filas:
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW - Ventana de 30 filas:
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
Diga esta operación en voz alta durante una entrevista para que el panel vea que procede de forma deliberada y no está adivinando.
Ventanas centradas frente a ventanas hacia atrás
El ejemplo anterior es un promedio hacia atrás: solo mira hacia atrás, por lo que es causal y seguro para los paneles de previsión.
Un promedio centrado mira en ambas direcciones; por ejemplo, ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING crea una ventana centrada de 7 filas. Las ventanas centradas suavizan de forma más simétrica, pero no pueden calcularse en tiempo real para las filas más recientes. Mencione cuál necesita el caso de uso.
SELECT
sale_date,
AVG(amount) OVER (
ORDER BY sale_date
ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING
) AS centered_avg_7
FROM daily_sales;Efecto en el borde de la ventana
Al principio de los datos, la ventana completa todavía no existe. En la primera fila de un promedio móvil de 7 días hacia atrás, solo hay 1 fila disponible, por lo que AVG promedia únicamente ese valor.
Esto significa que las primeras filas muestran un promedio de "calentamiento" calculado sobre menos filas. Los entrevistadores preguntan cómo gestionarlo. Hay dos opciones: aceptar la ventana parcial o suprimir las primeras filas exigiendo un recuento completo.
Omitir ventanas parciales
Si la empresa quiere obtener NULL hasta que haya una ventana completa, use COUNT(*) sobre el mismo marco y deje en blanco las ventanas cortas con una expresión CASE.
Es un detalle cuidado que demuestra que ha pensado en la corrección en los límites, algo que muchos candidatos pasan por alto.
SELECT
sale_date,
CASE WHEN COUNT(*) OVER w = 7
THEN AVG(amount) OVER w
END AS moving_avg_7d
FROM daily_sales
WINDOW w AS (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);Reutilizar un marco con WINDOW
La consulta anterior utilizaba una cláusula WINDOW con nombre. Cuando el mismo marco aparece varias veces, definirlo una sola vez como WINDOW w AS (...) y hacer referencia a él mediante OVER w mantiene la consulta clara y evita repetir código.
Postgres, MySQL 8 y SQL Server admiten ventanas con nombre. Usar una en una entrevista demuestra un dominio de las funciones de ventana que va más allá de copiar y pegar.
SELECT
sale_date,
AVG(amount) OVER w AS avg_7d,
SUM(amount) OVER w AS sum_7d
FROM daily_sales
WINDOW w AS (
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
);Trampa de los días naturales frente a las filas
Una trampa sutil: si a la tabla le faltan días, ROWS 6 PRECEDING abarca las últimas 7 filas registradas, que pueden cubrir más de 7 días naturales.
Para obtener un promedio real de 7 días naturales que respete los huecos, use RANGE con un desplazamiento de intervalo o combine primero los datos con una serie completa de fechas para que cada día tenga una fila. Nombrar esta diferencia demuestra precisamente el conocimiento de ROWS frente a RANGE de la lección anterior.
SELECT
sale_date,
AVG(amount) OVER (
ORDER BY sale_date
RANGE BETWEEN INTERVAL '6 days' PRECEDING AND CURRENT ROW
) AS calendar_avg_7d
FROM daily_sales;Promedios móviles por grupo
Al igual que los totales acumulados, los promedios móviles normalmente deben reiniciarse por entidad. Añada PARTITION BY para que cada producto o tienda tenga su propia ventana deslizante, sin mezclar datos entre grupos.
El marco y el orden funcionan de forma independiente dentro de cada partición, por lo que las primeras filas de cada grupo comienzan correctamente su propio calentamiento.
SELECT
product_id,
sale_date,
AVG(amount) OVER (
PARTITION BY product_id
ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
) AS product_ma_7d
FROM daily_sales;El suavizado en acción
¿Por qué hacerlo? Los ingresos diarios presentan picos; un promedio móvil revela la tendencia. Una respuesta habitual de un analista combina el valor sin procesar con su línea suavizada para que el panel muestre tanto la señal como el ruido.
También puede comparar un promedio móvil corto con uno largo (por ejemplo, de 7 días frente a uno de 30 días) para detectar el impulso, el equivalente en SQL de un cruce de promedios móviles.
SELECT
sale_date,
amount,
AVG(amount) OVER (ORDER BY sale_date
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS ma_7,
AVG(amount) OVER (ORDER BY sale_date
ROWS BETWEEN 29 PRECEDING AND CURRENT ROW) AS ma_30
FROM daily_sales;Lista de comprobación para la entrevista
Para responder correctamente a una pregunta sobre promedios móviles, cubra los siguientes puntos:
AVG OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW).- Tamaño de la ventana = filas anteriores + 1.
- Elección entre ventana hacia atrás y centrada.
- Calentamiento de la ventana parcial y forma de suprimirlo.
ROWSfrente aRANGEcuando faltan días.PARTITION BYpara reiniciar por entidad.
Comprobación rápida
Elija el marco para un promedio móvil de 7 días hacia atrás sobre filas diarias.
Recapitulación: promedios móviles
Un promedio móvil es AVG(value) OVER (ORDER BY ... ROWS BETWEEN n-1 PRECEDING AND CURRENT ROW), donde el tamaño de la ventana es el número de filas anteriores más uno. Elija una ventana hacia atrás o centrada según el caso de uso, gestione las filas de calentamiento con una comprobación mediante COUNT y cambie a un intervalo RANGE cuando importen los huecos del calendario.
Reinicie por entidad con PARTITION BY y reutilice los marcos mediante un WINDOW con nombre. A continuación, convertiremos sumas acumuladas en porcentajes con la proporción acumulada del total.
Preguntas frecuentes
¿La lección «Medias móviles en una ventana deslizante» es gratis?
Sí — el texto completo de «Medias móviles en una ventana deslizante» 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 «Medias móviles en una ventana deslizante»?
Calcule medias móviles de N periodos con BETWEEN PRECEDING AND CURRENT ROW 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 «Medias móviles en una ventana deslizante»?
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
- Sumas acumuladas con marcos de ventana
- Marcos ROWS frente a RANGE
- Medias móviles en una ventana deslizante
- Distribución acumulada y porcentaje del total