博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql之部门工资前三的所有员工
阅读量:3963 次
发布时间:2019-05-24

本文共 1918 字,大约阅读时间需要 6 分钟。

题目叙述

在这里插入图片描述

要求

在这里插入图片描述

解法一:
注:mysql也可以用开窗函数,用法与hive略有区别

select d.name department,a.name name,a.salary from department d,(SELECT name,salary ,departmentid,Dense_rank() over(partition by departmentid order by salary desc) as ranking from  employee1 ) a where a.departmentid = d.id and a.ranking <= 3

此方法最为简单,看着不复杂,在此不做详细解释

解法二:自定义变量
简化问题(分步骤)
分解步骤的思路,可以依据必要存在的步骤进行分解
1.根据 部门 (升),薪水 (降) 顺序查询出每个部门的员工 (Department, Employee, Salary)

SELECT dep.Name Department, emp.Name Employee, emp.SalaryFROM Employee empINNER JOIN Department dep ON emp.DepartmentId = dep.IdORDER BY emp.DepartmentId, emp.Salary DESC

2.每个部门的员工根据薪水进行排序

由于原本没有排序的字段,所以这里就需要自定义变量补充一个字段出来

## 先(部门,薪水)去重,再 部门(升),薪水(降) 排序SELECT te.DepartmentId, te.Salary,       CASE             WHEN @pre = DepartmentId THEN @rank:= @rank + 1            WHEN @pre := DepartmentId THEN @rank:= 1       END AS RANKFROM (SELECT @pre:=null, @rank:=0)tt,     (## (部门,薪水)去重,根据 部门(升),薪水(降) 排序         SELECT DepartmentId,Salary         FROM Employee         GROUP BY DepartmentId,Salary         ORDER BY DepartmentId,Salary DESC     )te

组合步骤

组合步骤时,尽量将每个步骤变成一个 结果集(不存在二次查询)
再将所有步骤的 结果集进行关联,从而提高性能

SELECT dep.Name Department, emp.Name Employee, emp.SalaryFROM (## 自定义变量RANK, 查找出 每个部门工资前三的排名        SELECT te.DepartmentId, te.Salary,               CASE                     WHEN @pre = DepartmentId THEN @rank:= @rank + 1                    WHEN @pre := DepartmentId THEN @rank:= 1               END AS RANK        FROM (SELECT @pre:=null, @rank:=0)tt,             (## (部门,薪水)去重,根据 部门(升),薪水(降) 排序                 SELECT DepartmentId,Salary                 FROM Employee                 GROUP BY DepartmentId,Salary                 ORDER BY DepartmentId,Salary DESC             )te       )tINNER JOIN Department dep ON t.DepartmentId = dep.IdINNER JOIN Employee emp ON t.DepartmentId = emp.DepartmentId and t.Salary = emp.Salary and t.RANK <= 3ORDER BY t.DepartmentId, t.Salary DESC ## t 结果集已有序,根据该集合排序

转载地址:http://fzgzi.baihongyu.com/

你可能感兴趣的文章
方法重载
查看>>
域和局部变量的初始值
查看>>
对象初始化方式及顺序
查看>>
重写 equals 方法
查看>>
重写 hashCode 方法
查看>>
Spring Batch 注册监听器
查看>>
正则表达式的匹配原理
查看>>
实现 Comparable 和 Comparator 接口
查看>>
重写 copy 方法
查看>>
内部类
查看>>
固化分组和占有量词
查看>>
去除首尾空白字符
查看>>
去掉文件名中的路径
查看>>
Spring Batch Step 流程
查看>>
动态代理
查看>>
如何写出高效的正则表达式
查看>>
多个 ZooKeeper 服务器的例子
查看>>
正则表达式
查看>>
Java I/O
查看>>
序列化
查看>>