目录
一、首先,需要排名打标,第一步想到 窗口函数 :rank()、dense_rank()、row_number()
二、解决完排名,接下来需要做的创建一个带有薪水排名的 临时表(查询中常用到),并与部门表进行连接,查到部门表中的部门名称
以上是 员工表 和 部门表 ,需要解决的问题是查询各部门中薪水(salary)排名前三的员工的姓名(name)、月薪(salary)、部门名称(Department . name)
一、首先,需要排名打标,第一步想到 窗口函数 :rank()、dense_rank()、row_number()
(1) rank() : 表中排名若出现名次相同的情况,属于同一名次,之后的名次不能与上个名次连续(例如:学生的成绩,若有两个最高分,则同为第一名;第二高的分则为第三名)
(2) dense_rank() : 表中排名若出现名次相同的情况,属于同一名次,后一个的名次是上个名次后的连续的数字(例如:学生的成绩,若有两个最高分,则同为第一名;第二高的分则为第二名)
(3) row_number() : 排名按连续数字排序,每一行匹配一个连续的整数(例如:学生的成绩,若有两个最高分,不能同为第一名,分别是第一和第二)
< 在该题中因为员工的薪水可能有相同的情况,且查询条件是薪水前三的员工,则需要用到的窗口函数是 dense_rank() >
写法如下:
DENSE_RANK() OVER(partition by Employee.departmentId order by salary desc) as DR
注意:这里的分组用到的是 partition by, partition by 与 group by 的区别是: 前者返回的是分组里的每一条数据,后者只能返回聚合之后的组的数据统计值的记录!!!
二、解决完排名,接下来需要做的创建一个带有薪水排名的 临时表(查询中常用到),并与部门表进行连接,查到部门表中的部门名称
写法如下:
select Department.name as Department
, Employee.name as Employee
, Employee.salary as Salary
, DENSE_RANK() OVER(partition by Employee.departmentId order by salary desc) as DR
from Employee
left join Department
on Employee.departmentId = Department.id
三、最后加上where子句,筛选出排名前三的员工
完整代码如下:
select Department
, Employee
, Salary
from (select Department.name as Department
, Employee.name as Employee
, Employee.salary as Salary
, DENSE_RANK() OVER(partition by Employee.departmentId order by salary desc) as DR
from Employee
left join Department
on Employee.departmentId = Department.id
) as TB
where DR < 4;
以上就是查询薪水排名前三的员工的所有过程,希望对你有帮助!