Titulo original
Employee
La siguiente tabla contiene información sobre todos los empleados, cada empleado tiene su número de trabajo correspondiente Id
, nombre Name
, salario Salary
y número de departamento DepartmentId
.
+----+-------+--------+--------------+
| Id | Name | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1 | Joe | 85000 | 1 |
| 2 | Henry | 80000 | 2 |
| 3 | Sam | 60000 | 2 |
| 4 | Max | 90000 | 1 |
| 5 | Janet | 69000 | 1 |
| 6 | Randy | 85000 | 1 |
| 7 | Will | 70000 | 1 |
+----+-------+--------+--------------+
Department
La tabla contiene información sobre todos los departamentos de la empresa.
+----+----------+
| Id | Name |
+----+----------+
| 1 | IT |
| 2 | Sales |
+----+----------+
Escriba una consulta SQL para encontrar todos los empleados de cada departamento que recibieron los tres salarios más altos. Por ejemplo, de acuerdo con la tabla anterior, el resultado de la consulta debería devolver:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT | Max | 90000 |
| IT | Randy | 85000 |
| IT | Joe | 85000 |
| IT | Will | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
+------------+----------+--------+
Explicación:
En el departamento de TI, Max recibió el salario más alto, Randy y Joe recibieron el segundo salario más alto y el salario de Will ocupó el tercer lugar. El departamento de ventas (Ventas) tiene solo dos empleados, Henry tiene el salario más alto y Sam tiene el segundo salario más alto.
Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/department-top-three-salaries Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.
Solucion 1
Los 3 mejores salarios de la empresa significan que no hay más de 3 salarios superiores a estos valores.
select e1.Name as 'Employee', e1.Salary
from Employee e1
where 3 >
(
select count(distinct e2.Salary)
from Employee e2
where e2.Salary > e1.Salary
)
;
En este código, hemos contado cuántas personas tienen salarios más altos que e1.Salary, por lo que la salida de la muestra debería ser la siguiente.
| Employee | Salary |
|----------|--------|
| Henry | 80000 |
| Max | 90000 |
| Randy | 85000 |
Luego, necesitamos unir la tabla Empleado y la tabla Departamento para obtener información del departamento.
SELECT
d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
Employee e1
JOIN
Department d ON e1.DepartmentId = d.Id
WHERE
3 > (SELECT
COUNT(DISTINCT e2.Salary)
FROM
Employee e2
WHERE
e2.Salary > e1.Salary
AND e1.DepartmentId = e2.DepartmentId
)
;
| Department | Employee | Salary |
|------------|----------|--------|
| IT | Joe | 70000 |
| Sales | Henry | 80000 |
| Sales | Sam | 60000 |
| IT | Max | 90000 |
| IT | Randy | 85000 |