El segundo salario más alto, de cinco formas
Compare soluciones con subconsultas, LIMIT/OFFSET y funciones de ventana
El segundo salario más alto, de cinco formas es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 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 que le harán a todo el mundo
«Encuentre el segundo salario más alto» es la pregunta de entrevistas de SQL más frecuente. A las personas entrevistadoras les gusta porque tiene muchas respuestas correctas y varias trampas sutiles.
Suponga una tabla employee con las columnas id y salary. Su tarea es devolver el segundo valor de salario distinto más alto.
- Si los salarios son 300, 200, 200 y 100, la respuesta es 200, no la segunda fila.
- Si no existe un segundo salario distinto, la respuesta esperada normalmente es
NULL.
En las próximas escenas lo resolveremos de cinco formas distintas y analizaremos cuándo resulta más conveniente cada una.
CREATE TABLE employee (
id INT PRIMARY KEY,
salary INT
);Forma 1: MAX de los valores inferiores al MAX
La solución más intuitiva: el segundo salario más alto es el salario mayor que sea estrictamente inferior al máximo general.
Se lee casi como una frase en inglés y funciona en cualquier dialecto de SQL. La subconsulta interna encuentra el valor más alto y el MAX externo encuentra el valor más grande por debajo de él.
Ventaja adicional: si no existe un segundo salario distinto, el MAX externo agrega cero filas y devuelve NULL automáticamente. Este NULL gratuito es exactamente lo que quieren las personas entrevistadoras.
SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);Por qué la subconsulta gestiona los duplicados
Observe que nunca usamos DISTINCT en el Método 1 y, aun así, los duplicados se gestionan correctamente.
Si tres personas ganan 200 y la persona con el salario más alto gana 300, la consulta interna devuelve 300. El filtro externo conserva todas las filas inferiores a 300, y el MAX de esas filas es 200, independientemente de cuántos valores 200 haya.
Esta es la idea clave: las funciones de agregación agrupan los duplicados por usted. Muchos candidatos complican innecesariamente la solución con DISTINCT cuando la función de agregación ya produce el resultado correcto.
Método 2: LIMIT con OFFSET
En MySQL y PostgreSQL puede ordenar los salarios distintos de forma descendente y omitir el primero.
OFFSET 1omite el salario más alto.LIMIT 1conserva solo el siguiente.
DISTINCT es esencial aquí; de lo contrario, los salarios máximos duplicados harían que OFFSET 1 llegara a otra repetición del máximo en lugar del verdadero segundo salario más alto.
Trampa: si no existe un segundo valor distinto, esto devuelve cero filas, no NULL. Corregiremos ese caso límite en la lección 4.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;Método 3: FETCH para SQL Server y Oracle
SQL Server y las versiones modernas de Oracle no admiten LIMIT ... OFFSET. En su lugar, utilizan la sintaxis estándar ANSI OFFSET ... FETCH.
La lógica es idéntica a la del Método 2: ordenar los salarios distintos de forma descendente, omitir una fila y obtener una. Conocer la sintaxis equivalente entre distintos dialectos demuestra experiencia práctica en una entrevista.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;Método 4: función de ventana DENSE_RANK
El enfoque moderno y escalable utiliza una función de ventana. DENSE_RANK asigna el rango 1 al salario más alto, el rango 2 al siguiente salario distinto y asigna el mismo rango a los salarios empatados, sin dejar huecos.
Calculamos el rango en una subconsulta y después filtramos el rango 2 en la consulta externa. Recuerde que no puede filtrar directamente una función de ventana en WHERE, por lo que el envoltorio de la subconsulta es obligatorio.
SELECT salary AS second_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 2;Por qué DENSE_RANK y no RANK ni ROW_NUMBER
La elección de la función de clasificación es importante para la semántica de los valores «distintos»:
ROW_NUMBERasigna un número único a cada fila, de modo que dos personas que ganen 300 ocuparían las filas 1 y 2, y el rango 2 repetiría el salario máximo. Incorrecto.RANKdeja huecos después de los empates: dos salarios de 300 reciben el rango 1 y el siguiente salario salta al rango 3. No lo encontraría en el rango 2. Incorrecto.DENSE_RANKasigna el mismo rango a los empates y no deja huecos, por lo que el rango 2 siempre corresponde al segundo salario distinto. Correcto.
Método 5: recuento con subconsulta correlacionada
Un recurso clásico anterior a las funciones de ventana: un salario es el N.º más alto si hay exactamente N-1 salarios distintos estrictamente mayores que él.
Para el segundo salario más alto, queremos que haya exactamente un salario distinto por encima. Es una solución elegante, pero puede ser lenta en tablas grandes porque el recuento interno se ejecuta para cada fila externa.
Se generaliza fácilmente al N.º salario más alto cambiando el recuento a N - 1, por eso a los entrevistadores les gusta verlo.
SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
);Un ejemplo completo, de principio a fin
Considere los salarios: 500, 500, 350, 350, 100.
- Método 1: MAX es 500 y el valor más grande inferior a 500 es 350. La respuesta es 350.
- Método 4 (DENSE_RANK): 500 -> rango 1, 350 -> rango 2, 100 -> rango 3. El rango 2 es 350.
- Método 5: para el salario 350, hay exactamente un salario distinto (500) que es mayor. Coincide. La respuesta es 350.
Los cinco métodos coinciden: el segundo salario distinto más alto es 350, incluso cuando existen duplicados.
Cuál debería elegir
Orientación para entrevistas:
- Plantee primero la pregunta: «¿Necesita salarios distintos y
NULLsi no existe ninguno?». Aclararlo suma puntos. - DENSE_RANK es la respuesta predeterminada más sólida; se generaliza de forma limpia al N.º salario más alto y a los grupos.
- MAX por debajo de MAX es la mejor solución de una sola línea y devuelve
NULLautomáticamente. - LIMIT/OFFSET es conciso, pero específico de cada dialecto y no devuelve filas en el caso límite.
Mencionar las ventajas y desventajas en voz alta es lo que distingue una respuesta de nivel intermedio de una respuesta de nivel inicial.
Errores comunes que debe evitar
Preste atención a estas trampas que los entrevistadores suelen preparar:
- Usar
ROW_NUMBERen lugar deDENSE_RANKy obtener dos veces el salario máximo. - Olvidar
DISTINCTen la versión con LIMIT/OFFSET cuando existen varios salarios máximos iguales. - Suponer que
ORDER BY salary DESC LIMIT 1,1devuelve un valor distinto (no lo hace). - Devolver la segunda fila en lugar del segundo valor.
Comprobación rápida
Compruebe que entiende la elección de la función de clasificación.
Resumen
Ahora conoce cinco formas de encontrar el segundo salario más alto:
- MAX por debajo de MAX: portable y devuelve
NULLautomáticamente. - LIMIT/OFFSET y OFFSET/FETCH: concisos y específicos de cada dialecto.
- DENSE_RANK: la opción predeterminada y escalable que gestiona correctamente los empates.
- Recuento correlacionado: elegante y generalizable al N.º salario más alto.
Conclusiones clave: pregunte si necesita valores distintos, prefiera DENSE_RANK para gestionar empates y recuerde qué métodos devuelven NULL y cuáles no devuelven filas cuando no existe un segundo valor.
Preguntas frecuentes
¿La lección «El segundo salario más alto, de cinco formas» es gratis?
Sí — el texto completo de «El segundo salario más alto, de cinco formas» 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 «El segundo salario más alto, de cinco formas»?
Compare soluciones con subconsultas, LIMIT/OFFSET y funciones de ventana 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 1 de 4.
¿Cuánto tiempo toma la lección «El segundo salario más alto, de cinco formas»?
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
- El segundo salario más alto, de cinco formas
- El enésimo valor más alto con DENSE_RANK
- La persona con mayores ingresos por departamento
- Devolver NULL cuando no existe el enésimo valor