RANK frente a DENSE_RANK con empates
La pregunta clásica sobre clasificación con huecos o sin ellos cuando hay valores empatados
RANK frente a DENSE_RANK con empates es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.
Las tres funciones de ranking, una junto a otra
SQL ofrece tres funciones de ventana de ranking, y la pregunta más frecuente sobre ventanas es cómo se diferencian cuando hay empates:
- ROW_NUMBER: siempre es único; asigna a los empates números distintos arbitrarios.
- RANK: los empates comparten el ranking y el siguiente ranking salta (deja un hueco).
- DENSE_RANK: los empates comparten el ranking y el siguiente ranking no salta (no deja huecos).
Ser capaz de explicar esta diferencia inmediatamente es una señal fiable en una entrevista.
Una tabla de ejemplo concreta
Imagine cinco puntuaciones ordenadas de forma descendente: 100, 90, 90, 80, 70. Observe cómo las numera cada función.
- ROW_NUMBER: 1, 2, 3, 4, 5
- RANK: 1, 2, 2, 4, 5 (salta el 3 después del empate)
- DENSE_RANK: 1, 2, 2, 3, 4 (no hay salto)
Memorice este ejemplo de 100/90/90/80/70: le permitirá responder la pregunta al instante.
SELECT
score,
ROW_NUMBER() OVER (ORDER BY score DESC) AS rownum,
RANK() OVER (ORDER BY score DESC) AS rnk,
DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Cómo calcula RANK el salto
RANK asigna a cada fila un ranking igual a uno más el número de filas que la preceden estrictamente en el orden. Las dos filas empatadas con el valor 90 tienen una fila delante (la de 100), por lo que ambas obtienen el ranking 2. El siguiente valor inferior tiene tres filas delante, por lo que salta al ranking 4.
Por eso RANK reproduce la puntuación de las competiciones: medallistas de plata empatados y ningún bronce.
-- scores 100,90,90,80 -> RANK = 1,2,2,4
SELECT score, RANK() OVER (ORDER BY score DESC) AS rnk
FROM scores;Cómo DENSE_RANK evita el salto
DENSE_RANK asigna un ranking igual a uno más el número de valores distintos que preceden al valor actual. Después del empate en 90, solo había dos valores distintos antes del 80 (100 y 90), por lo que obtiene el ranking 3, sin salto.
Use DENSE_RANK cuando le importen las posiciones de valores distintos, como en «el segundo salario más alto», donde los empates deben contar una sola vez.
-- scores 100,90,90,80 -> DENSE_RANK = 1,2,2,3
SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS dense
FROM scores;Cuándo elegir cada función
Una guía rápida para tomar decisiones que los entrevistadores suelen valorar:
- ¿Necesita exactamente una fila por posición (registro más reciente, paginación)? → ROW_NUMBER.
- ¿Necesita una clasificación en la que los empates compartan puesto y los saltos sean correctos (clasificación deportiva, los 3 primeros incluyendo empates)? → RANK.
- ¿Necesita el valor distinto en la posición N (el N.º salario más alto)? → DENSE_RANK.
Elegir la opción incorrecta cambia las filas que devuelve, así que debe justificar su elección en voz alta.
Clasificación dentro de particiones
Las tres funciones aceptan PARTITION BY para clasificar de forma independiente dentro de cada grupo. Cada partición vuelve a empezar en el rango 1.
Aquí, cada departamento clasifica a sus propios empleados por salario y los empates se gestionan con DENSE_RANK. La persona que más gana en cada departamento ocupa el rango 1 y los empleados con el mismo salario comparten rango.
SELECT
department,
name,
salary,
DENSE_RANK() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS salary_rank
FROM employees;Ejemplo práctico: los 3 primeros incluyendo empates
«Devuelva los 3 salarios más altos por departamento y, si varias personas empatan en el tercer puesto, inclúyalas a todas». Esto requiere RANK o DENSE_RANK, no ROW_NUMBER.
Usar DENSE_RANK <= 3 conserva los tres niveles salariales distintos más altos y a cada empleado de esos niveles; eso es exactamente lo que significa «incluyendo empates».
SELECT department, name, salary, salary_rank
FROM (
SELECT department, name, salary,
DENSE_RANK() OVER (
PARTITION BY department ORDER BY salary DESC
) AS salary_rank
FROM employees
) t
WHERE salary_rank <= 3;Ejemplo práctico: el segundo salario más alto
La pregunta más famosa de las entrevistas de SQL. La respuesta robusta utiliza DENSE_RANK para que los salarios máximos duplicados no oculten el verdadero segundo valor.
Si tres personas tienen el salario máximo, DENSE_RANK = 2 sigue identificando correctamente el siguiente salario distinto, mientras que ROW_NUMBER = 2 simplemente devolvería a otra persona con el salario máximo.
SELECT DISTINCT salary AS second_highest
FROM (
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS dr
FROM employees
) t
WHERE dr = 2;RANK frente a DENSE_RANK para el «N.º más alto»
¿Por qué usar DENSE_RANK en lugar de RANK para los problemas del N.º valor más alto? Porque RANK deja saltos. Con los salarios 100, 100, 90, el valor 90 tiene RANK = 3, pero DENSE_RANK = 2.
Si la pregunta solicita «el 2.º salario distinto más alto», filtrar con RANK = 2 no devolvería nada, mientras que DENSE_RANK = 2 devolvería correctamente 90. Asocie siempre «N.º distinto» con DENSE_RANK.
-- salaries 100,100,90
-- RANK: 1,1,3 -> WHERE rank = 2 returns NOTHING
-- DENSE_RANK: 1,1,2 -> WHERE dense_rank = 2 returns 90Consideraciones entre dialectos
Buenas noticias: ROW_NUMBER, RANK y DENSE_RANK forman parte del estándar SQL y se comportan de forma idéntica en PostgreSQL, SQL Server, Oracle, MySQL 8+, BigQuery y Snowflake. La semántica de los empates descrita anteriormente es universal.
Una función relacionada, PERCENT_RANK, se basa en RANK para proporcionar una posición relativa de 0 a 1. Conviene mencionarla si el entrevistador pregunta por la clasificación percentil.
Errores comunes
Preste atención a estos puntos:
- Usar
ROW_NUMBERpara obtener el «N.º más alto» y no incluir las filas empatadas. - Usar
RANKcuando la pregunta se refiere a valores distintos y obtener resultados vacíos debido a los saltos. - Olvidar
ORDER BYdentro deOVER: la clasificación no tiene sentido sin él. - Filtrar la clasificación directamente en
WHEREen lugar de hacerlo en una consulta externa.
Comprobación rápida
Aplique las reglas de los empates.
Resumen: con saltos y sin saltos
Ahora puede elegir al instante la función de clasificación adecuada:
- ROW_NUMBER: números únicos, sin rangos compartidos.
- RANK: los empates comparten rango y después dejan un salto (1,2,2,4).
- DENSE_RANK: los empates comparten rango, sin saltos (1,2,2,3).
- «N.º más alto distinto» →
DENSE_RANK; «los N primeros incluyendo empates» →RANK/DENSE_RANK; «una fila por posición» →ROW_NUMBER.
A continuación: cómo filtrar realmente un resultado de ventana, ya que no puede hacerlo en WHERE.
Preguntas frecuentes
¿La lección «RANK frente a DENSE_RANK con empates» es gratis?
Sí — el texto completo de «RANK frente a DENSE_RANK con empates» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «RANK frente a DENSE_RANK con empates»?
La pregunta clásica sobre clasificación con huecos o sin ellos cuando hay valores empatados Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Interview Prep?
No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «RANK frente a DENSE_RANK con empates»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?
Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- OVER, PARTITION BY y ORDER BY
- ROW_NUMBER para secuencias únicas
- RANK frente a DENSE_RANK con empates
- Filtrar por un resultado de ventana