De ventanaestándar SQL

DENSE_RANK

Asigna puestos teniendo en cuenta los empates, pero sin huecos: 1, 2, 2, 3.

Sintaxis

DENSE_RANK() OVER (ORDER BY <criterio de orden>)
DENSE_RANK() OVER (PARTITION BY <grupo> ORDER BY <criterio de orden>)

Los valores iguales comparten puesto, y el siguiente valor recibe el número siguiente, sin saltos. Útil cuando lo que importa son los niveles de los valores: el salario más alto, el segundo más alto, el tercero.

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

Puestos sin huecos
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS place
FROM employees;
namesalaryplace
Olivia13501
Emma12002
Sophia12002
Liam10003
Noah9504

Emma y Sophia comparten el segundo puesto, y Liam es tercero. RANK lo pondría cuarto.

RANK y DENSE_RANK lado a lado
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
namesalaryrankdense_rank
Olivia135011
Emma120022
Sophia120022
Liam100043
Noah95054
El segundo salario más altoAvanzado
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS place
FROM employees
) ranked
WHERE place = 2;
namesalary
Emma1200
Sophia1200

Un ejercicio clásico de entrevistas. DENSE_RANK encuentra justo el segundo valor, lo tengan cuantas personas lo tengan.

Ten en cuenta

DENSE_RANK no dice cuántas personas hay por encima: Liam tiene el puesto 3, aunque delante tiene a tres personas. Si necesitas la posición contando a todos, usa RANK.

El puesto no se puede usar en el WHERE de la misma consulta: calcúlalo primero en una subconsulta y filtra fuera.

Funciones relacionadas

Más detalles en el curso