Comparar ROW_NUMBER, RANK y DENSE_RANK
Objetivos
Al terminar podrás elegir una función de ranking según la forma en que quieres tratar empates.
Concepto
ROW_NUMBER() da a cada fila un número distinto. RANK() comparte puesto entre empates y deja un hueco después. DENSE_RANK() comparte puesto, pero no deja huecos.
Las tres son funciones de ventana: el CTE agrupa primero los pagos por mes y luego la ventana asigna una posición a cada fila mensual. El ORDER BY final decide la presentación; para ROW_NUMBER incluye un desempate estable.
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 total_amount,
ROW_NUMBER() OVER (ORDER BY total_amount DESC, payment_month) AS row_number_rank,
RANK() OVER (ORDER BY total_amount DESC) AS rank_with_gaps,
DENSE_RANK() OVER (ORDER BY total_amount DESC) AS dense_rank_value
FROM monthly
ORDER BY total_amount DESC, payment_month;Un empate depende de los valores de los datos. ROW_NUMBER usa el mes como desempate, mientras RANK y DENSE_RANK comparan solo el total.
Práctica guiada
- Cambia el orden a
ASCy observa qué periodo queda primero. - Quita
payment_monthdeROW_NUMBERy explica por qué el orden entre empates puede variar. - Busca dos filas con el mismo total en un conjunto de prueba para observar el hueco de
RANK.
Reto
Asigna una posición única a las tiendas por importe total. Usa una clave estable para resolver empates y explica cuándo preferirías RANK.
Quiz
Después de dos filas empatadas en el primer lugar, ¿qué rango sigue con DENSE_RANK?
- A. 2
- B. 3
- C. Depende del número de filas empatadas
Respuesta: A. DENSE_RANK comparte el uno y continúa con dos, sin dejar un hueco.
Comprobación
Ya eliges cómo numerar empates. La siguiente lección compara un periodo con el anterior y el siguiente.