查询各部门中薪水排名前三的员工的姓名、月薪、部门名称

目录

一、首先,需要排名打标,第一步想到 窗口函数 :rank()、dense_rank()、row_number()

二、解决完排名,接下来需要做的创建一个带有薪水排名的 临时表(查询中常用到),并与部门表进行连接,查到部门表中的部门名称

三、最后加上where子句,筛选出排名前三的员工

                 以上是 员工表 和 部门表 ,需要解决的问题是查询各部门中薪水(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;

        以上就是查询薪水排名前三的员工的所有过程,希望对你有帮助!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值