DENSE_RANK
Devuelve el rango de una fila en la partición de la ventana, como RANK, pero sin huecos entre los puestos.
MySQL 8.4
DENSE_RANK()Valor devuelto
Número entero (BIGINT UNSIGNED), el puesto de la fila; los valores iguales comparten puesto y el siguiente puesto es una unidad mayor: 1, 2, 2, 3
Ejemplos
DENSE_RANK y RANK por estado
MySQL 8.4
SELECT member_name,
status,
RANK() OVER (
ORDER BY status
) AS status_rank,
DENSE_RANK() OVER (
ORDER BY status
) AS status_dense_rank
FROM FamilyMembers;Productos más caros de cada categoría
MySQL 8.4
SELECT category,
name,
price
FROM (
SELECT category,
name,
price,
DENSE_RANK() OVER (
PARTITION BY category
ORDER BY price DESC
) AS price_rank
FROM products
) AS ranked
WHERE price_rank = 1;Detalles
Sin ORDER BY, todas las filas de la partición reciben el rango 1. Resulta práctico para encontrar el N-ésimo valor más alto: las filas con DENSE_RANK() = 2 contienen el segundo valor aunque el primero aparezca varias veces. Por el rango se filtra en la consulta externa: en el WHERE de la misma consulta no puedes usar funciones de ventana.