LeetCode--1077. 项目员工 III

50 阅读2分钟

1 题目描述

项目表 Project:

+-------------+---------+  
| Column Name | Type    |  
+-------------+---------+  
| project_id  | int     |  
| employee_id | int     |  
+-------------+---------+  

(project_id, employee_id) 是这个表的主键 (具有唯一值的列的组合)
employee_id 是员工表 Employee 的外键 (reference 列)
该表的每一行都表明具有 employee_id 的雇员正在处理具有 project_id 的项目

员工表 Employee:

+------------------+---------+  
| Column Name      | Type    |  
+------------------+---------+  
| employee_id      | int     |  
| name             | varchar |  
| experience_years | int     |  
+------------------+---------+  

employee_id 是这个表的主键 (具有唯一值的列)
该表的每一行都包含一名雇员的信息

编写解决方案, 报告在每一个项目中经验最丰富 的雇员是谁. 如果出现经验年数相同的情况, 请报告所有具有最大经验年数的员工
返回结果表无顺序要求

2 测试用例

输入:
Project 表:

+-------------+-------------+  
| project_id  | employee_id |  
+-------------+-------------+  
| 1           | 1           |  
| 1           | 2           |  
| 1           | 3           |  
| 2           | 1           |  
| 2           | 4           |  
+-------------+-------------+  

Employee 表:

+-------------+--------+------------------+  
| employee_id | name   | experience_years |  
+-------------+--------+------------------+  
| 1           | Khaled | 3                |  
| 2           | Ali    | 2                |  
| 3           | John   | 3                |  
| 4           | Doe    | 2                |  
+-------------+--------+------------------+  

输出:

+-------------+---------------+  
| project_id  | employee_id   |  
+-------------+---------------+  
| 1           | 1             |  
| 1           | 3             |  
| 2           | 1             |  
+-------------+---------------+  

解释: employee_id 为 1 和 3 的员工在 project_id 为 1 的项目中拥有最丰富的经验. 在 project_id 为 2 的项目中, employee_id 为 1 的员工拥有最丰富的经验

3 解题思路

  1. 将表 ProjectEmployee 关联起来, 按照 project_id 分组对员工的工作年限进行排名
select p.project_id,  
     p.employee_id,  
     e.experience_years,  
     rank() over (partition by p.project_id order by e.experience_years desc) as rn  
from Project as p  
       inner join Employee as e  
               on p.employee_id = e.employee_id  

查询结果

+----------+-----------+----------------+--+  
|project_id|employee_id|experience_years|rn|  
+----------+-----------+----------------+--+  
|1         |1          |3               |1 |  
|1         |3          |3               |1 |  
|1         |2          |2               |3 |  
|2         |1          |3               |1 |  
|2         |4          |2               |2 |  
+----------+-----------+----------------+--+  
  1. 对上述结果进行排名过滤 s.rn = 1, 查找出每个项目工作年限最多的员工信息
select s.project_id,  
       s.employee_id  
from (select p.project_id,  
             p.employee_id,  
             e.experience_years,  
             rank() over (partition by p.project_id order by e.experience_years desc) as rn  
      from Project as p  
               inner join Employee as e  
                          on p.employee_id = e.employee_id) as s  
where s.rn = 1;  

查询结果

+----------+-----------+  
|project_id|employee_id|  
+----------+-----------+  
|1         |1          |  
|1         |3          |  
|2         |1          |  
+----------+-----------+