Mejores Tres Salarios Por Departamento

A los directivos de una empresa les interesa saber quién gana más dinero en cada uno de los departamentos de la empresa. Un empleado que gana mucho en un departamento es el que tiene un sueldo entre los tres mejores sueldos únicos de ese departamento. Escribe una solución para encontrar a los empleados que más ganan en cada departamento. Regresa el resultado en cualquier orden.

#database

Tabla: Employee

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+

- `id` es la llave primaria (columna con valores únicos) para esta tabla.
- `departmentId` es una llave foranea (columna de referencia) hacia el ID de la tabla Department.
- Cada fila de esta tabla indica el ID, `name`, y `salary` de un empleado. También contiene el ID de su departamento.

Tabla: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+

- `id` es la llave primaria (columna con valores únicos) para esta tabla.
- Cada fila de esta tabla indica el ID de un departamento y su nombre.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Employee:
+----+-------+--------+--------------+
| 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            |
+----+-------+--------+--------------+

Tabla Department:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+

Salida:

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Joe      | 85000  |
| IT         | Randy    | 85000  |
| IT         | Will     | 70000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+

Explicación:
En el departamento de IT:
- Max tiene el salario único más alto
- Both, Randy y Joe tienen el segundo salario único más alto
- Will tiene el tercer salario único más alto

En el departamento de Sales:
- Henry tiene el salario más alto
- Sam tiene el segundo salario más alto
- No hay registro de un tercer empleado con el tercer puesto, dado que este departamento sólo tiene dos empleados

Solución:

WITH top3 AS (
    SELECT d.name AS dept,
           e.name AS ename,
           e.salary AS esalary,
           dense_rank() over(PARTITION BY d.name ORDER BY e.salary DESC) AS rown
           FROM employee e
           INNER JOIN department d ON d.id = e.departmentid
    )
SELECT dept AS Department,
       ename AS Employee,
       esalary AS Salary
FROM top3
WHERE rown <= 3;

slackmart blog © 2024