SQL语句——对所有员工的薪水按照salary进行按照1-N的排名
题目描述
对所有员工的当前(to_date=‘9999-01-01’)薪水按照salary进行按照1-N的排名,相同salary并列且按照emp_no升序排列
建表语句:
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
输出描述:
emp_no | salary | rank |
---|---|---|
10005 | 94692 | 1 |
10002 | 94409 | 2 |
10010 | 94409 | 2 |
10001 | 88958 | 3 |
10007 | 88958 | 3 |
10004 | 74057 | 4 |
不看最后一个rank排名,那么这道题特别简单:
select s.emp_no, s.salary
from salaries s
where s.to_date = '9999-01-01'
order by s.salary desc, s.emp_no asc
但是题目偏偏加了一个rank工资排名。那么怎样才能获得这个排名呢?
在Java中我们可以直接使用循环来给目标值加排名,SQL查询语句中看来行不通。仅仅使用一张表似乎达不到目的,那就使用两张表吧。
既然不能使用循环,那么可以通过什么方法来表示排名,或者说是表示在自己的前面还有多少人(包括自己)。
很明显了,我们可以通过两张表中salary的大小不同来获取在自己前面的人的个数,即s1.salary <= s2.salary。举个栗子:
有三个salary(6000,5000,4000, 4000),输出为s1.salary,那么当s1.salary = 6000时,s1.salary <= s2.salary 的值为6000,也就是一个,当s1.salary = 5000时,s1.salary <= s2.salary 的值为6000和5000两个。但是当s1.salary = 4000时,s1.salary <= s2.salary 的值就为(6000,5000,4000, 4000)四个,且4000是重复的,因此我们使用count(distinct s2.salary) rank 来去重,并计算个数,即排名,以此类推,输出s1.salary的情况下,有多少个s2.salary大于等于s1.salary就是s1.salary的排名
当然不要忘了group by s1.emp_no ,用来将员工编号分组,计算count()
最后结果为:
select s1.emp_no, s1.salary, count(distinct s2.salary) rank
from salaries s1, salaries s2
where s1.salary <= s2.salary and s1.to_date = '9999-01-01' and s2.to_date = '9999-01-01'
group by s1.emp_no
order by rank
SQL语句——对所有员工的薪水按照salary进行按照1-N的排名相关推荐
- 使用sql语句在emp员工表中实现各种操作
使用sql语句在emp员工表中实现各种操作 emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪金/comm佣金/deptno所属部门编号 ...
- 牛客网数据库SQL实战23—— 对所有员工的薪水按照salary进行按照1-N的排名
牛客网数据库SQL实战23-- 对所有员工的薪水按照salary进行按照1-N的排名 题目描述 对所有员工的当前(to_date='9999-01-01')薪水按照salary进行按照1-N的排名,相 ...
- ORACLE中使用SQL语句查询所有员工的职位信息,并用DISTINCT消除重复信息。
ORACLE中使用SQL语句查询所有员工的职位信息,并用DISTINCT消除重复信息. 在sqlplus中执行下面语句: select job from emp: 显示结果如下: SQL> se ...
- Python编程 模拟SQL语句 实现对员工信息的增删改查
一.问题描述 用 Python 模拟 sql 语句,实现对员工信息的增删改查. 封装函数,传入参数:文件路径和 sql 命令. 模拟 sql 语句实现对员工信息的现增删改查,并打印结果. 二.Pyth ...
- sql语句-平均工资-员工工资
表创建: 员工表: DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `emp_id` int(11) ...
- Mysql - 对所有员工的薪水按照salary进行按照1-N的排名
- sql语句面试经典题型
目录 案例一:获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列 案例二:请你获取薪水第二多的员工的emp_no以 ...
- oracle与sql语句
oracle与sql语句 数据库基础 Oracle数据库安装及访问 Oracle相关操作 创建表空间与用户 创建表 Oracle数据类型 创建表 修改表 DML语句 INSERT语句 UPDATE语句 ...
- python对excel增删改查语句_利用python模拟sql语句对员工表格进行增删改查
本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 具体需求: 员工信息表程序,实现增删改查操作: 可进行模糊查询, ...
最新文章
- 【Java】剑指 Offer II 022. 链表中环的入口节点
- php in_array 遍历,in_array大数组查询性能问题
- UVA 311 Packets
- 牛客网——华为机试(题17:坐标移动)(Java)
- 这个高度站立办公十分的棒
- python中进制chr_python中的chr() 如何返回字符?
- 下载 sdk struts java
- iphone11什么时候上市_红米k30s至尊纪念版什么时候上市开售 预售地址入口
- ORACLE虚拟索引(Virtual Index)
- 述职答辩提问环节一般可以问些什么_陕西省高级职称评审,90%的人都“死”在答辩上?...
- 相关矩阵可视化 – corrplot() 绘图
- Red5 java项目创建
- 心情好,贴一小段自己写的VBS服务器端过程,做了适度封装
- 金山WPS笔试题总结
- cad卸载工具_CAD安装失败都是红?
- provide和inject 用法
- 路由器AP、中继、桥接等模式区别
- Universal USB Installer – 免光驱将U盘打造成Windows、Linux系统安装盘
- 历时三年,Filecoin 主网正式上线 | 一周问答热议
- SpringCloud( H版 alibaba )框架开发教程(中级)
热门文章
- 2017.2.15 日课
- Oracle数据库用管理员登录,oracle数据库关于用户登录
- codeforces 101986 C Medical Checkup
- 程序验证(一):命题逻辑
- 转战“小家电”后 ,苏泊尔掉队了吗?
- ORB-SLAM3 细读单目初始化过程(下)
- ZooKeeper 会话超时
- 宏定义中的 ## ... __VA_ARGS__
- kail 工具使用(一) ddos 攻击
- 嵌入式系统设计信息交流 微信讨论组