java Mixin Java程序员 shiny Normalizecss Echojs seo外包优化 vue前端框架 后台管理界面模板 pmp视频 mac虚拟打印机 div外边距 centos查看python版本 matlab自然对数 python命令行参数 python链接mysql数据库 python实例教程 python免费教程 java正则表达式用法 java多线程处理 java怎么输出数组 java注释规范 sql实例 javascript源代码 java电子书下载 霜之祝福 crazytalk mpg格式转换 位置不可用 梦幻手游助手 cdr字体变形 videoview 苹果电脑数据恢复 加字幕软件 wps苹果电脑版 苹果电脑怎么收藏网页 vue动态路由 python简单代码 sai怎么复制图层 ps尺子的快捷键
当前位置: 首页 > 学习教程  > 编程语言

SQL | 刷题 | 部门工资前三高的员工

2020/11/4 14:49:41 文章标签:

题目 Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId 。 --------------------------------- | Id | Name | Salary | DepartmentId | --------------------------------- | 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  |
+------------+----------+--------+

解释:

IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资排第二。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/department-top-three-salaries
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  • 思路一

1、使用窗口函数dense_rank()不间断排序,薪水相同的会并列排名

SELECT Name,Salary,DepartmentId,DENSE_RANK() OVER(PARTITION BY DepartmentId ORDER BY Salary DESC) drk
FROM Employee

2、得到子表与表Department连接,获取部门名称

SELECT d.Name as Department,a.Name as Employee, a.Salary
FROM (SELECT Name,Salary,DepartmentId,DENSE_RANK() OVER(PARTITION BY DepartmentId ORDER BY Salary DESC) drk
FROM Employee) a JOIN Department d ON a.DepartmentId=d.Id

3、加入限定条件,前三即取小于等于3排序值,并按薪水降序

SELECT d.Name as Department,a.Name as Employee, a.Salary
FROM (SELECT Name,Salary,DepartmentId,DENSE_RANK() OVER(PARTITION BY DepartmentId ORDER BY Salary DESC) drk
FROM Employee) a JOIN Department d ON a.DepartmentId=d.Id
WHERE a.drk<=3
ORDER BY a.Salary DESC;
  • 思路二
    表自连接,如果工资部门前三,在同一部门的前提下,工资去重之后最多只有2个比该工资高
SELECT d.Name as Department,e1.Name as Employee, e1.Salary
FROM Employee e1 join Department d on e1.DepartmentId=d.Id
WHERE 3>(SELECT count(distinct e2.Salary)
FROM Employee e2
WHERE e1.Salary<e2.Salary
AND e1.DepartmentId=e2.DepartmentId);

本文链接: http://www.dtmao.cc/news_show_350215.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?