0Pricing
Coding Interview Prep · Lección

El enésimo valor más alto con DENSE_RANK

Generalice la solución al enésimo valor distinto y gestione los duplicados

El enésimo valor más alto con DENSE_RANK es una lección gratuita de Coding 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 Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

Generalización al N.º salario más alto

Una vez que sabe encontrar el segundo salario más alto, los entrevistadores plantean inmediatamente el siguiente reto: «Ahora encuentre el N.º salario más alto». La respuesta más clara y sólida utiliza DENSE_RANK.

El patrón es siempre el mismo: clasificar los salarios distintos en orden descendente y después filtrar la fila cuyo rango sea igual a N. Como la lógica no cambia con N, este único enfoque responde a toda la familia de preguntas.

Lo desarrollaremos paso a paso, gestionaremos los empates y los duplicados, y explicaremos por qué DENSE_RANK es la función de clasificación adecuada para la semántica de «valor distinto».

La plantilla básica

Aquí tiene la plantilla reutilizable para el N.º salario más alto. Sustituya la constante por el valor de N que solicite el entrevistador.

Calcule DENSE_RANK en una consulta interna (la función de ventana no puede estar en WHERE) y después filtre por rnk = N en la consulta externa. Para obtener el tercer salario más alto, establezca el filtro en rnk = 3.

SELECT salary AS nth_highest
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = 3;

Cómo numera DENSE_RANK los valores distintos

DENSE_RANK asigna el mismo rango a los valores iguales y nunca deja un hueco después. Esa es exactamente la definición de «N.º valor distinto» que suelen buscar los entrevistadores.

Para los salarios 800, 800, 600, 600, 400:

  • 800 -> rango 1
  • 600 -> rango 2
  • 400 -> rango 3

Por tanto, el tercer salario más alto es 400, aunque haya cinco filas. Los duplicados se agrupan automáticamente en un solo rango.

Por qué RANK da una respuesta incorrecta

Sustituya la función por RANK y la respuesta deja de ser correcta. RANK deja huecos proporcionales al número de empates.

Para 800, 800, 600, 600, 400:

  • 800, 800 -> rango 1 (dos valores)
  • 600, 600 -> rango 3 (hay un hueco: no existe el rango 2)
  • 400 -> rango 5

El filtro rnk = 3 devuelve 600, mientras que rnk = 2 no devuelve nada. Salvo que el entrevistador solicite específicamente una clasificación al estilo de las competiciones, DENSE_RANK es la opción correcta para el «N.º salario distinto más alto».

Por qué ROW_NUMBER también es incorrecto aquí

ROW_NUMBER asigna un número único a cada fila e ignora por completo los empates. Para 800, 800, 600, 600, 400 produce 1, 2, 3, 4, 5.

Por tanto, rn = 3 devuelve 600, pero rn = 2 devuelve el 800 duplicado, no un segundo valor distinto. ROW_NUMBER responde a «la N.ª fila», no a «el N.º valor distinto».

Use ROW_NUMBER únicamente cuando la pregunta realmente solicite una fila específica, por ejemplo, para eliminar duplicados o conservar exactamente una fila por grupo en un resultado de los N primeros.

SELECT salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employee;

Parametrizar N de forma segura

En código real no escribiría el rango directamente. Pase N como parámetro y compárelo con él. La definición de la ventana permanece idéntica; solo se parametriza el filtro externo.

Este enfoque también permite devolver todos los salarios empatados en el rango N: como DENSE_RANK comparte el rango entre los empates, WHERE rnk = N puede devolver varias filas si varios empleados comparten el N.º salario distinto, que suele ser el comportamiento deseado.

SELECT id, salary
FROM (
  SELECT id, salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = :n;

La generalización del recuento correlacionado

El enfoque anterior a las funciones de ventana también se generaliza: un salario es el N.º salario distinto más alto cuando hay exactamente N - 1 salarios distintos estrictamente mayores que él.

Para el tercer salario más alto, exija exactamente 2 salarios distintos más altos. Funciona en motores antiguos sin funciones de ventana, pero escala mal porque el recuento interno se vuelve a ejecutar para cada fila externa.

SELECT DISTINCT salary AS nth_highest
FROM employee e
WHERE (
  SELECT COUNT(DISTINCT e2.salary)
  FROM employee e2
  WHERE e2.salary > e.salary
) = 2;

La forma de función de MySQL que suelen pedir los entrevistadores

El problema de estilo LeetCode «N.º salario más alto» suele pedir una función almacenada que devuelva un único valor. El cuerpo no es más que la plantilla de DENSE_RANK adaptada para devolver un salario.

No necesita memorizar la sintaxis exacta de la función en una entrevista, pero conviene saber que LIMIT N-1, 1 sobre salarios distintos es la expresión idiomática compacta de MySQL.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2;  -- N = 3, so OFFSET N-1

Ejemplo resuelto: cuarto salario más alto

Salarios: 1000, 900, 900, 700, 500, 500, 300.

Orden descendente de los valores distintos con DENSE_RANK:

  • 1000 -> 1
  • 900 -> 2
  • 700 -> 3
  • 500 -> 4
  • 300 -> 5

El cuarto salario más alto es 500. Observe que las dos filas con 500 comparten el rango 4, por lo que filtrar rnk = 4 devuelve a ambos empleados que ganan 500 si también selecciona sus identificadores.

Consideraciones de rendimiento

¿Cómo se comparan los enfoques a gran escala?

  • DENSE_RANK: un ordenamiento de los datos y después un filtro. Es eficiente y el planificador puede utilizar un índice sobre salary para ordenar.
  • Recuento correlacionado: potencialmente O(n al cuadrado), porque la agregación interna se ejecuta para cada fila. Evítelo en tablas grandes.
  • LIMIT/OFFSET: es rápido para valores pequeños de N, pero aun así debe ordenar; además, los offsets grandes recorren y descartan muchas filas.

Si empieza con DENSE_RANK, rara vez se equivocará.

Casos límite que conviene mencionar

Los candidatos sólidos señalan los casos límite antes de que se los pregunten:

  • N mayor que el número de salarios distintos: el filtro no coincide con ninguna fila y devuelve un resultado vacío. En la lección 4 se explica cómo forzar un único NULL.
  • Empates en el rango N: DENSE_RANK devuelve a todos los empleados empatados; decida si ese es el comportamiento deseado.
  • N = 1: la plantilla sigue funcionando y devuelve el máximo.

Comprobación rápida

Aplique la plantilla para el N.º salario más alto.

Resumen

Para encontrar el N.º salario más alto, hay una respuesta predeterminada: clasificar los salarios distintos con DENSE_RANK() OVER (ORDER BY salary DESC) en una subconsulta y después aplicar el filtro WHERE rnk = N.

  • DENSE_RANK significa «N.º valor distinto», con los empates compartiendo un rango y sin dejar huecos.
  • RANK introduce huecos; ROW_NUMBER cuenta filas, no valores.
  • El truco del recuento correlacionado = N-1 generaliza la misma idea sin funciones de ventana, pero escala mal.

Señale siempre el caso límite en el que «N supera los valores disponibles», que resolveremos a continuación.

Preguntas frecuentes

¿La lección «El enésimo valor más alto con DENSE_RANK» es gratis?

Sí — el texto completo de «El enésimo valor más alto con DENSE_RANK» 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 Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «El enésimo valor más alto con DENSE_RANK»?

Generalice la solución al enésimo valor distinto y gestione los duplicados Practicas Coding 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 Coding Interview Prep?

No se requiere experiencia previa. Coding 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 «El enésimo valor más alto con DENSE_RANK»?

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 Coding Interview Prep?

Sí. Cada lección de Coding 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. El segundo salario más alto, de cinco formas
  2. El enésimo valor más alto con DENSE_RANK
  3. La persona con mayores ingresos por departamento
  4. Devolver NULL cuando no existe el enésimo valor
← Volver a Coding Interview Prep