Clasificar meses con una función de ventana
Objetivos
Vas a resumir pagos por mes y añadir un ranking que conserva cada mes en el resultado.
Concepto
GROUP BY combina filas y produce una fila por grupo. Una función de ventana calcula algo relacionado con otras filas, pero conserva cada fila que recibe.
RANK() OVER (ORDER BY ...) asigna posiciones. Si dos meses empatan, reciben el mismo rango y el siguiente rango deja un espacio. DATE_FORMAT convierte la fecha en una etiqueta año-mes para agrupar pagos mensuales.
Ejemplo
WITH monthly_totals 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 total_amount,
RANK() OVER (ORDER BY total_amount DESC) AS revenue_rank
FROM monthly_totals
ORDER BY revenue_rank, payment_month;El CTE produce una fila por mes; RANK agrega revenue_rank sin borrar ninguna de esas filas. El orden exterior determina cómo se presentan los meses; el ORDER BY dentro de OVER determina cómo se calcula el rango.
Nota
Alcance: la fecha corresponde a los registros existentes en payment. Este ejercicio compara los meses presentes en la base del curso; no rellena meses sin actividad.
Práctica guiada
- Cambia
RANK()porROW_NUMBER()y compara cómo trata los empates. - Cambia la ventana para ordenar por
total_amount ASC. - Quita el
ORDER BYexterior y explica por qué el ranking no garantiza por sí solo el orden visual del resultado.
Reto
Adapta el análisis para mostrar el número de pagos por mes junto con el total. Luego crea un ROW_NUMBER() que asigne una posición única a cada mes por total descendente y etiqueta los empates con payment_month en el orden final.
Quiz
¿Qué conserva RANK() OVER (...) en esta consulta?
- A. Cada fila mensual del CTE, agregando una columna de ranking.
- B. Solo la fila del mes con mayor total.
- C. Una fila por pago original.
Respuesta: A. La función de ventana añade el rango al resumen sin volver a agruparlo.
Comprobación
Ya ordenas periodos por una métrica sin perder las filas del resumen. La siguiente lección delimita intervalos de fechas que incluyen todo el periodo esperado.
Consulta la documentación oficial de funciones de ventana de MySQL 8 para revisar OVER, RANK y funciones relacionadas.