0Pricing
SQL Interview Prep · Lección

Gestionar empates en los valores superiores

Sepa cuándo usar RANK o DENSE_RANK para incluir todas las filas empatadas

Gestionar empates en los valores superiores es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 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.

La pregunta de seguimiento sobre empates

Cuando resuelve correctamente el top-N con ROW_NUMBER, el entrevistador le plantea una dificultad adicional: «¿Qué ocurre si dos empleados tienen exactamente el mismo salario en el límite? ¿Deberían incluirse ambos?»

Esto diferencia a los candidatos que memorizaron una consulta de quienes entienden la semántica de las clasificaciones. La respuesta depende de elegir entre ROW_NUMBER, RANK y DENSE_RANK. En esta lección se relaciona cada función con la intención empresarial.

ROW_NUMBER oculta los empates

ROW_NUMBER asigna un entero estrictamente único a cada fila. Incluso cuando dos filas empatan en la columna de ordenación, una recibe 2 y la otra 3 en un orden arbitrario.

Consecuencia: un filtro WHERE rn <= 3 devuelve exactamente 3 filas y puede descartar silenciosamente una fila empatada que razonablemente debería haberse incluido. Esto está bien cuando realmente desea una cantidad fija, pero es incorrecto cuando todos los empates deben clasificarse.

-- Salaries: 100, 90, 90, 80
-- ROW_NUMBER -> 1, 2, 3, 4  (the two 90s get 2 and 3 arbitrarily)
ROW_NUMBER() OVER (ORDER BY salary DESC)

RANK deja huecos

RANK asigna a las filas empatadas la misma posición y, después, salta los valores siguientes para tener en cuenta los empates. Dos filas empatadas en la posición 2 reciben ambas el valor 2, y la fila siguiente salta a la posición 4 (no a la 3).

Use RANK cuando desee las «3 primeras posiciones» y una posición pueda estar ocupada por varias personas, imitando las clasificaciones de una competición real, donde dos medallas de plata implican que no hay medalla de bronce.

-- Salaries: 100, 90, 90, 80
-- RANK -> 1, 2, 2, 4   (rank 3 is skipped)
RANK() OVER (ORDER BY salary DESC)

DENSE_RANK no deja huecos

DENSE_RANK también asigna a las filas empatadas la misma posición, pero no omite la siguiente. Dos filas empatadas en la posición 2 reciben ambas el valor 2, y el siguiente valor distinto es 3.

Use DENSE_RANK cuando la pregunta se refiera a valores distintos: «los 3 niveles salariales distintos más altos» o «los 3 niveles de precios superiores». Cuenta valores únicos, no filas.

-- Salaries: 100, 90, 90, 80
-- DENSE_RANK -> 1, 2, 2, 3   (no gap)
DENSE_RANK() OVER (ORDER BY salary DESC)

Comparación lado a lado

Para la lista de salarios 100, 90, 90, 80, las tres funciones producen:

  • ROW_NUMBER: 1, 2, 3, 4
  • RANK: 1, 2, 2, 4
  • DENSE_RANK: 1, 2, 2, 3

Conviene memorizar esta tabla a la perfección. El entrevistador puede pedirle simplemente que la complete para una lista determinada, y entender correctamente el comportamiento de los huecos es precisamente el objetivo.

SELECT salary,
  ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn,
  RANK()       OVER (ORDER BY salary DESC) AS rnk,
  DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees;

Incluir todas las filas empatadas con RANK

Para responder a «las 3 primeras, pero incluya a todos los que empaten en el límite», filtre con RANK() <= 3. Si dos personas comparten la posición 3, ambas aparecen, por lo que el resultado puede contener más de 3 filas.

Esta es la intención de las preguntas formuladas como «las 3 primeras posiciones» en lugar de «3 filas cualesquiera». Indique explícitamente que el número de filas puede superar N cuando hay empates.

WITH ranked AS (
  SELECT name, department, salary,
         RANK() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rnk
  FROM employees
)
SELECT name, department, salary, rnk
FROM ranked
WHERE rnk <= 3
ORDER BY department, rnk;

Los 3 niveles distintos superiores con DENSE_RANK

Cuando el requisito es obtener «los 3 niveles salariales distintos más altos» e incluir a todos los empleados de esos tres niveles, use DENSE_RANK() <= 3.

Esto puede devolver muchas filas: todos los empleados de los tres niveles salariales superiores, sin importar cuántos haya en cada nivel. La idea clave es que DENSE_RANK cuenta valores distintos, por lo que el filtro selecciona niveles de valores en lugar de una cantidad fija de filas.

WITH ranked AS (
  SELECT name, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
  FROM employees
)
SELECT name, salary, drnk
FROM ranked
WHERE drnk <= 3
ORDER BY drnk;

Guía para decidir

Relacione la formulación con la función:

  • «Exactamente N filas» o paginación → ROW_NUMBER (añada un criterio de desempate).
  • «Las N primeras posiciones, los empates comparten posición» → RANK.
  • «Los N valores, niveles o categorías distintos superiores» → DENSE_RANK.

Cuando la especificación sea ambigua, pregunte: «Si hay un empate en el límite, ¿debo incluir todas las filas empatadas o limitar el resultado a N?». Esa pregunta de aclaración le hace ganar puntos.

Los criterios de desempate siguen siendo importantes

Incluso con RANK o DENSE_RANK, añadir una clave secundaria de ORDER BY controla el orden de visualización de las filas empatadas y mantiene estable el resultado. No cambia qué filas cumplen los criterios, pero hace que los resultados sean reproducibles.

Con ROW_NUMBER, el criterio de desempate es esencial porque determina qué fila empatada supera el límite de rn.

RANK() OVER (
  PARTITION BY department
  ORDER BY salary DESC, name ASC
) AS rnk

Ejemplo práctico: los máximos goleadores

Una tabla game_scores contiene player y score. El entrevistador quiere «todos los jugadores que ocupen las 2 primeras posiciones por puntuación». Un empate en el primer puesto significa que dos jugadores ocupan la posición 1 y que la siguiente puntuación distinta ocupa la posición 2.

«Posiciones» sin saltos después de un empate apunta a DENSE_RANK. Si en cambio dijera «las 2 primeras posiciones con saltos», cambiaría a RANK. Preste atención a la formulación exacta.

WITH r AS (
  SELECT player, score,
         DENSE_RANK() OVER (ORDER BY score DESC) AS pos
  FROM game_scores
)
SELECT player, score, pos
FROM r
WHERE pos <= 2
ORDER BY pos, player;

Errores habituales que debe evitar

Estos son los errores que suelen vigilar los entrevistadores:

  • Usar ROW_NUMBER cuando la pregunta requiere incluir los empates, descartando silenciosamente una fila válida.
  • Confundir el comportamiento de los huecos de RANK y DENSE_RANK.
  • Olvidar que los filtros de RANK/DENSE_RANK pueden devolver más de N filas y afirmar después que el resultado es incorrecto.
  • Omitir PARTITION BY cuando el top-N es por grupo y, en su lugar, clasificar toda la tabla.

Comprobación rápida

Elija la función de clasificación adecuada para el comportamiento de los empates descrito.

Resumen: gestión de empates

Tres funciones, tres comportamientos ante empates:

  • ROW_NUMBER: siempre genera valores únicos, exactamente N filas y resuelve los empates de forma arbitraria.
  • RANK: las filas empatadas comparten la misma posición y después aparecen saltos.
  • DENSE_RANK: las filas empatadas comparten la misma posición, no hay saltos y se cuentan los valores distintos.

Elija según cómo esté formulada la pregunta, solicite una aclaración cuando haya ambigüedad y recuerde que los filtros con RANK/DENSE_RANK pueden devolver más de N filas por diseño.

Preguntas frecuentes

¿La lección «Gestionar empates en los valores superiores» es gratis?

Sí — el texto completo de «Gestionar empates en los valores superiores» 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 «Gestionar empates en los valores superiores»?

Sepa cuándo usar RANK o DENSE_RANK para incluir todas las filas empatadas 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 2 de 4.

¿Cuánto tiempo toma la lección «Gestionar empates en los valores superiores»?

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

  1. Filas superiores por grupo con ROW_NUMBER
  2. Gestionar empates en los valores superiores
  3. Eliminar duplicados de forma segura
  4. Conservar la última fila por clave
← Volver a SQL Interview Prep