Calcular totales acumulados con una ventana
Objetivos
Al terminar podrás sumar desde el primer periodo observado hasta la fila actual sin reemplazar el total de cada periodo.
Concepto
SUM(valor) OVER (...) calcula una suma relacionada con las filas de la ventana y conserva cada fila mensual. El marco ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW define el acumulado desde la primera fila del orden hasta la actual.
Un acumulado depende del orden elegido. Aquí es cronológico y solo recorre los meses presentes en payment; no inventa meses sin actividad.
Ejemplo
WITH monthly AS (
SELECT
DATE_FORMAT(payment_date, '%Y-%m') AS payment_month,
SUM(amount) AS total_amount
FROM payment
GROUP BY DATE_FORMAT(payment_date, '%Y-%m')
)
SELECT
payment_month,
ROUND(total_amount, 2) AS monthly_amount,
ROUND(
SUM(total_amount) OVER (
ORDER BY payment_month
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
),
2
) AS cumulative_amount
FROM monthly
ORDER BY payment_month;monthly_amount describe una sola etiqueta temporal. cumulative_amount suma desde el primer mes observado hasta el actual.
Práctica guiada
- Cambia el orden a
DESCy explica desde qué fila comienza el acumulado. - Quita el marco
ROWSy revisa cómo los empates pueden influir en el marco predeterminado. - Añade el conteo de pagos mensual junto al importe acumulado.
Reto
Calcula un total acumulado por staff_primary_store_id ordenado por mes, usando un marco explícito. Antes de consultar, decide si necesitas un acumulado independiente por tienda.
Quiz
¿Qué define UNBOUNDED PRECEDING AND CURRENT ROW?
- A. Un marco desde la primera fila del orden hasta la fila actual.
- B. Solo la fila siguiente a la actual.
- C. Todas las filas futuras y ninguna pasada.
Respuesta: A. Ese marco produce un total que se acumula conforme avanza el orden.
Comprobación
Ya analizas periodos y ventanas. En el proyecto final aplicarás filtros, uniones, métricas y verificaciones sobre Sakila.