力扣题目跳转(1077. 项目员工 III - 力扣(LeetCode))
项目表
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 是这个表的主键(具有唯一值的列) 该表的每一行都包含一名雇员的信息。
题目要求:
编写解决方案,报告在每一个项目中 经验最丰富 的雇员是谁。如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工。
返回结果表 无顺序要求 。
结果格式如下示例所示。
示例 1:
输入: 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 的员工拥有最丰富的经验。
case 1 的建表语句。
Create table If Not Exists Project (project_id int, employee_id int)
Create table If Not Exists Employee (employee_id int, name varchar(10), experience_years int)
Truncate table Project
insert into Project (project_id, employee_id) values ('1', '1')
insert into Project (project_id, employee_id) values ('1', '2')
insert into Project (project_id, employee_id) values ('1', '3')
insert into Project (project_id, employee_id) values ('2', '1')
insert into Project (project_id, employee_id) values ('2', '4')
Truncate table Employee
insert into Employee (employee_id, name, experience_years) values ('1', 'Khaled', '3')
insert into Employee (employee_id, name, experience_years) values ('2', 'Ali', '2')
insert into Employee (employee_id, name, experience_years) values ('3', 'John', '3')
insert into Employee (employee_id, name, experience_years) values ('4', 'Doe', '2')
一 首先我们对两张表进行左连接,主表为 project 连接关键字是 p.employee_id = e.employee_id
select * from Project p left join Employee e on p.employee_id = e.employee_id;
输出如下
二 我们在基础上使用窗口函数增加一列作为判别不同项目中年龄最大的员工的依据。题目要求是需要并列。
select *, dense_rank() over (partition by project_id order by experience_years desc) as rn from Project p left join Employee e on p.employee_id = e.employee_id;
输出如下
三 那么我们在基础就进行数据删选继续了。我使用的是 CTE 表达式。因为表内的两个 employee _id 没有进行判别,所以后面需要打出来。
with tmp as (select project_id, p.employee_id, name, experience_years, dense_rank() over (partition by project_id order by experience_years desc) as rn from Project p left join Employee e on p.employee_id = e.employee_id) select project_id,employee_id from tmp where rn = 1;
输出如下
以上就是全部答案,如果对你有帮助请点个赞,谢谢。
来源:力扣(leecode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
转载请注明出处:
我会尽快把力扣上的所有数据库题目发出来。感兴趣的可以点个赞与关注。每天不定时跟新。
标签:Project,1077,员工,project,Employee,employee,years,III,id From: https://blog.csdn.net/CYJ1844/article/details/143083814