题目

有如下两张表
Project 表:
Day05 查询出每个项目中经验最丰富(experience_years最大)的员工 - 图1
Employee 表:
Day05 查询出每个项目中经验最丰富(experience_years最大)的员工 - 图2
查询出每个项目中经验最丰富(experience_years最大)的员工,返回的结果如下:
Day05 查询出每个项目中经验最丰富(experience_years最大)的员工 - 图3
说明:员工1和3是project_id为1中exprerience_years最丰富的,
而project_id为2的项目,员工id为1的是exprerience_years最丰富

数据准备

  1. CREATE TABLE project(
  2. project_id INT,
  3. employee_id int
  4. )
  5. ;
  6. CREATE TABLE employee(
  7. employee_id INT,
  8. name VARCHAR(20),
  9. experience_years INT
  10. )
  11. ;
  12. INSERT INTO project VALUES(1,1);
  13. INSERT INTO project VALUES(1,2);
  14. INSERT INTO project VALUES(1,3);
  15. INSERT INTO project VALUES(2,1);
  16. INSERT INTO project VALUES(2,4);
  17. INSERT INTO employee VALUES(1,'Khaled',3);
  18. INSERT INTO employee VALUES(2,'Ali',2);
  19. INSERT INTO employee VALUES(3,'John',3);
  20. INSERT INTO employee VALUES(4,'Doe',2);

解题思路

  1. 本题主要考察表连接查询和排名函数RANK() 或 DENSE_RANK()

RANK()与DENSE_RANK()的本质区别是当排名重复时排名相同,后续排名是顺延还是按照真实排序

image.png

  1. SELECT p.project_id,p.employee_id
  2. ,e.experience_years
  3. ,RANK() OVER(PARTITION BY p.project_id ORDER BY e.experience_years DESC) R
  4. FROM dbo.project p
  5. LEFT JOIN dbo.employee e ON e.employee_id = p.employee_id
  1. 查询R=1的就是工作经验比较丰富的
    1. SELECT t.project_id,t.employee_id FROM(
    2. SELECT p.project_id,p.employee_id
    3. ,e.experience_years
    4. ,RANK() OVER(PARTITION BY p.project_id ORDER BY e.experience_years DESC) R
    5. FROM dbo.project p
    6. LEFT JOIN dbo.employee e ON e.employee_id = p.employee_id
    7. )t
    8. WHERE t.R = 1
    image.png