185. 部门工资前三高的所有员工 【leetcode】

记录刷题踩过的坑

  1. 部门工资前三高的所有员工
    题目描述:
    Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 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 表包含公司所有部门的信息。
    ±—±---------+
    | Id | Name |
    ±—±---------+
    | 1 | IT |
    | 2 | Sales |
    ±—±---------+
    编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:
    ±-----------±---------±-------+
    | Department | Employee | Salary |
    ±-----------±---------±-------+
    | IT | Max | 90000 |
    | IT | Randy | 85000 |
    | IT | Joe | 85000 |
    | IT | Will | 70000 |
    | Sales | Henry | 80000 |
    | Sales | Sam | 60000 |
    ±-----------±---------±-------+
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/department-top-three-salaries

解题思路

  1. 首先想到连接两个表,这里采用内连接。(本人踩过的坑:不能用左连接,因为左连接会保留左表Employee所有数据,而当Department无数据时,查询结果就是错的)
  2. 连接后需要对数据进行筛选。假如你的工资在部门前3中,那么部门中大于等于你的工资值的个数应该小于等于3(注意不是员工个数)。
    1)统计工资值大于或等于你(e1)的工资的个数,注意需要去重。
    2)统计值小于等于3,作为连接后的where筛选条件
where (
    select count(distinct e2.salary)
    from Employee e2
    where e2.salary>=e1.salary and e2.DepartmentId = e1.DepartmentId
)<=3
  1. 最后将结果排序:部门id升序,工资降序
select d1.Name Department,e1.Name Employee,Salary
from Employee e1 join Department d1
on e1.DepartmentId=d1.id
where (
    select count(distinct e2.salary)
    from Employee e2
    where e2.salary>=e1.salary and e2.DepartmentId = e1.DepartmentId
)<=3
order by DepartmentId,Salary desc

猜你喜欢

转载自blog.csdn.net/vale_/article/details/105857101