10th Apr 2025 Lectura de 6 minutos LeetCode SQL Problema y Solución: Los Tres Mejores Sueldos del Departamento LearnSQL.es Team preguntas para entrevista de SQL ejercicio de SQL Índice El Problema de los Tres Mejores Sueldos por Departamento La Tarea La Solución Paso 1: Encontrar a los empleados con mayores ingresos de la empresa Paso 2: Encontrar los departamentos con mayores ingresos Paso 3: Creación de la consulta final Solucionado: ¡El problema SQL más difícil de LeetCode! ¿Buscas una explicación detallada del ejercicio más difícil del LeetCode SQL 50? Hemos recopilado una explicación detallada de este problema SQL, con el proceso de pensamiento detrás de la solución y las instrucciones sobre cómo construir la consulta paso a paso. LeetCode es una popular plataforma online que ofrece una gran variedad de problemas SQL diseñados para ayudarte a aprender, practicar y prepararte para entrevistas. También ofrecen problemas de programación en otros lenguajes. Los problemas se agrupan en temas como algoritmos, estructuras de datos, bases de datos, diseño de sistemas y lenguajes de programación individuales. LeetCode también incluye un plan de estudio de 50 problemas de SQL para que adquieras todas las habilidades necesarias para superar una entrevista de ciencias de datos. Pero si buscas algo más que 50 problemas para aprender y practicar, considera los más de 120 ejercicios de nuestro cursoSQL para principiantes . También tenemos una colección de más de 100 preguntas SQL para entrevistas, diseñadas específicamente para que practiques antes de una entrevista de trabajo. En este artículo, echaremos un vistazo al problema más difícil del conjunto SQL de LeetCode: Los Tres Mejores Sueldos del Departamento. Discutiremos el proceso de pensamiento detrás de la solución y cómo construir la consulta paso a paso. ¿Listo? El Problema de los Tres Mejores Sueldos por Departamento Los Tres Mejores Salarios por Departamento es el único problema Difícil dentro del plan de estudio SQL 50 de LeetCode. Hay varios lugares donde podrías atascarte, así que abordemos este problema paso a paso. La Tarea Los directivos de una empresa están interesados en ver quién gana más dinero en cada uno de los departamentos de la empresa. Un empleado que gana mucho es aquel que tiene un salario entre los tres mejores salarios únicos de ese departamento. Escriba una solución para encontrar a los empleados que más ganan en cada uno de los departamentos. Eche un vistazo al esquema de la base de datos para esta tarea: La Solución Paso 1: Encontrar a los empleados con mayores ingresos de la empresa Empecemos por encontrar a los empleados que más ganan sin preocuparnos de los departamentos. La descripción del problema especifica que una persona con altos ingresos es cualquiera con un salario que sea uno de los 3 salarios únicos más altos. Esto significa que si hay varias personas con el mismo salario, todas ellas serán las que más ganen. Observe la siguiente tabla de resultados: namesalarysalary_rank Mike50001 John45002 Will40003 Max40003 Jane30004 Observe que, aunque sólo estamos seleccionando los cuatro salarios más altos, puede haber más de cuatro personas con salarios altos. Por ejemplo, Will y Max comparten el mismo salario y ambos terminan en la lista de los que más ganan con el mismo rango salarial de 3. No podemos utilizar ORDER BY y LIMIT para obtener los salarios más altos, porque no podemos saber cuántos salarios altos hay antes de ejecutar la consulta. Pero podemos filtrar el resultado por el rango salarial. Veamos cómo podemos obtener esa clasificación, ya que no está incluida en la base de datos. Existen tres funciones de clasificación en SQL: RANK(), DENSE_RANK(), y ROW_NUMBER(). Todas ellas devolverán un ranking de valores dentro del marco de ventana y la dirección de ordenación especificados. La diferencia entre ellas es cómo tratan los valores duplicados. Puede leer una explicación detallada sobre cómo utilizar las funciones de clasificación en nuestra Visión general de las funciones de clasificación en SQL. Eche un vistazo al mismo escenario anterior, pero ahora con todas las funciones de clasificación incluidas: namesalaryrankdense_rankrow_number Mike5000111 John4500222 Will4000333 Max4000334 Jane3000545 Como puede ver, RANK() y DENSE_RANK() devuelven el mismo rango si los salarios son iguales; este es el comportamiento que necesitamos para asegurarnos de que varias personas pueden ser incluidas como personas con salarios altos si comparten el mismo salario. Max quedaría excluido de la lista de los 3 primeros si se utiliza ROW_NUMBER() aunque tenga un salario de los 3 primeros. La diferencia entre RANK() y DENSE_RANK() es cómo gestionan los huecos en la clasificación que dejan los valores duplicados. RANK() omite un número de clasificación secuencial para cada clasificación duplicada, lo que hace que los valores no duplicados tengan la misma clasificación. DENSE_RANK() no omite clasificaciones en caso de duplicados. Eso es lo que queremos para este problema, ya que elimina la omisión de un salario top 3 cuando hay dos o más salarios top 2. He aquí una consulta que asignará a todos los empleados un rango basado en su salario utilizando DENSE_RANK(): SELECT e.name, e.salary, DENSE_RANK() OVER(ORDER BY e.salary DESC) FROM employee e; ¡Genial! Ahora obtenemos el mismo resultado que en el primer ejemplo: A todos los empleados se les asignan los rangos correspondientes a su rango salarial. El siguiente paso es crear una clasificación separada para cada departamento. Paso 2: Encontrar los departamentos con mayores ingresos Podemos añadir un PARTITION BY dentro de la cláusula OVER() para especificar el marco de ventana para cada fila basado en un valor dado. En este problema, queremos crear una clasificación de los 3 salarios más altos de cada departamento, por lo que debemos dividir el marco de ventana por el ID del departamento. Para profundizar en esta expresión, lea nuestro artículo sobre Cómo utilizar PARTITION BY con OVER(). Esta es la consulta que asignará los rangos por separado para cada departamento: SELECT d.name AS department, e.name AS employee, e.salary, DENSE_RANK() OVER(PARTITION BY d.id ORDER BY e.salary DESC) AS rank FROM employee e JOIN department d ON d.id = e.departmentId; Tenemos que unir los campos department y employee porque la tarea nos pide que mostremos los nombres de los departamentos. Sin embargo, la cláusula PARTITION BY debe utilizar la columna department.id (la department para asegurarse de que no haya dos departamentos asignados a la misma partición (lo que podría ocurrir si dos departamentos tienen el mismo nombre). Paso 3: Creación de la consulta final ¡Genial! Tenemos una clasificación local de salarios para cada departamento. ¿Y ahora qué? No podemos filtrar por la columna rango porque las funciones de ventana no están permitidas en la cláusula WHERE. Tendremos que envolver la consulta de clasificación en una CTE y obtener el resultado final a partir de ahí. Filtraremos por la columna rango para incluir sólo los 3 salarios más altos de cada departamento. Recuerde no incluir el rango en sí en el resultado final, ya que sólo necesitamos los salarios. Echa un vistazo a la solución completa del problema: WITH ranks AS ( SELECT d.name AS department, e.name AS employee, e.salary, DENSE_RANK() OVER(PARTITION BY d.id ORDER BY e.salary DESC) AS salary_rank FROM employee e JOIN department d ON d.id = e.departmentId ) SELECT department, employee, salary, FROM ranks WHERE salary_rank <= 3; Así de fácil, ¡tenemos una lista completa de los que más ganan en cada departamento! Solucionado: ¡El problema SQL más difícil de LeetCode! ¡Bien hecho! Hemos profundizado en el problema más difícil del plan de estudio SQL 50 de LeetCode. ¿Estás buscando más práctica más allá del plan SQL 50? Prueba nuestra pistaEjercicio de SQL y elige entre más de 1.000 ejercicios interactivos de SQL. Tags: preguntas para entrevista de SQL ejercicio de SQL