Referencia de funciones

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;
member_namestatusstatus_rankstatus_dense_rank
Lela Quinceydaughter11
Annie Quinceydaughter11
Wednesday Addamsdaughter11
Headley Quinceyfather42
Ernest Forrestfather42
Flavia Quinceymother63
Constance Forrestmother63
Andie Quinceyson84

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;
categorynameprice
DrinksGreen Smoothie6.99
FoodSushi Set24.99
GroceryOlive Oil 500ml7.99
SnacksDark Chocolate4.49

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.

Véase también

Dónde aprenderlo