春招打卡d17n35-leetcode刷题185部门工资前三高的所有员工

140 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode刷题185部门工资前三高的所有员工

前文

本题目为leetcode数据库类型题目,题目序号185,主要考察数据库查询相关知识,题目链接为https://leetcode-cn.com/problems/department-top-three-salaries/

题目信息

表: Employee

+--------------+---------+ | Column Name | Type | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---------+ Id是该表的主键列。 departmentId是Department表中ID的外键。 该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。  

表: Department

+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ Id是该表的主键列。 该表的每一行表示部门ID和部门名。  

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。

解题思路

根据题目信息可知,该题目想要在员工工资信息中,查询到每个部门的高工资者,也就是查询每个部门员工工资的前三名。如果只要查询第一名,我们可以直接采用group by分组即可得到结果。而该题目我们引入一个内置函数,Dense_Rank() OVER。该函数表示根据条件将已知数据进行排序,并返回排序结果。因此我们只要通过该函数对工资进行排序即可,排序后包含新字段形成新表。然后我们在新表中进行查询操作,并限定条件排名小于等于3,即可得到目标的查询结果,完成题目的解答。

解题答案

SELECT D.Name 'Department', X.Employee, X.Salary FROM( SELECT E.Name 'Employee', E.Salary 'Salary', E.DepartmentId 'DepartmentId', Dense_Rank() OVER (PARTITION BY E.DepartmentId ORDER BY E.Salary DESC) 'Rank' FROM Employee E ) X LEFT JOIN Department D ON X.DepartmentId = D.Id WHERE X.Rank<=3 AND D.Name IS NOT NULL

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。