De ventanaestándar SQL

RANK

Asigna puestos teniendo en cuenta los empates: los valores iguales comparten puesto y el siguiente se salta.

Sintaxis

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

Como en una competición: dos personas con el mismo resultado comparten el segundo puesto, y la siguiente queda cuarta, porque el tercero ya está «ocupado». Una función de ventana: el número de filas no cambia y cada una recibe su puesto. PARTITION BY calcula los puestos por separado en cada grupo.

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 por salario
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS place
FROM employees;
namesalaryplace
Olivia13501
Emma12002
Sophia12002
Liam10004
Noah9505

Emma y Sophia ganan lo mismo y comparten el segundo puesto, así que Liam es cuarto.

ROW_NUMBER, RANK y DENSE_RANK lado a lado
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number,
RANK() OVER (ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;
namesalaryrow_numberrankdense_rank
Olivia1350111
Emma1200222
Sophia1200322
Liam1000443
Noah950554
Los dos salarios más altos, empates incluidosAvanzado
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS place
FROM employees
) ranked
WHERE place <= 2;
namesalary
Olivia1350
Emma1200
Sophia1200

Salen tres personas, porque dos comparten el segundo puesto. Con ROW_NUMBER, una de ellas se quedaría fuera.

Ten en cuenta

Tras un empate se saltan puestos: 1, 2, 2, 4. Si los necesitas sin huecos —1, 2, 2, 3—, usa DENSE_RANK.

Sin ORDER BY en OVER, todas las filas se consideran iguales y reciben el puesto 1.

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