牛客网数据库SQL实战23—— 对所有员工的薪水按照salary进行按照1-N的排名
牛客网数据库SQL实战23—— 对所有员工的薪水按照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 |
10009 | 94409 | 2 |
10010 | 94409 | 2 |
10001 | 88958 | 3 |
10007 | 88070 | 4 |
10004 | 74057 | 5 |
10002 | 72527 | 6 |
10003 | 43311 | 7 |
10006 | 43311 | 7 |
10011 | 25828 | 8 |
我的解答
select emp_no,salary,dense_rank() over(order by salary desc)as rank
from salaries
where to_date = "9999-01-01"
order by salary desc,emp_no asc
此题是标准的dense_rank函数应用场景:
- row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。
- rank函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。
- dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。
我觉得最好的答案
本题的主要思想是复用salaries表进行比较排名,具体思路如下:
- 从两张相同的salaries表(分别为s1与s2)进行对比分析,先将两表限定条件设为to_date = ‘9999-01-01’,挑选出当前所有员工的薪水情况。
- 本题的精髓在于 s1.salary <= s2.salary,意思是在输出s1.salary的情况下,有多少个s2.salary大于等于s1.salary,比如当s1.salary=94409时,有3个s2.salary(分别为94692,94409,94409)大于等于它,但由于94409重复,利用COUNT(DISTINCT s2.salary)去重可得工资为94409的rank等于2。其余排名以此类推。
- 千万不要忘了GROUP BY s1.emp_no,否则输出的记录只有一条(可能是第一条或者最后一条,根据不同的数据库而定),因为用了合计函数COUNT()
- 最后先以 s1.salary 逆序排列,再以 s1.emp_no 顺序排列输出结果
SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS rank
FROM salaries AS s1, salaries AS s2
WHERE s1.to_date = '9999-01-01' AND s2.to_date = '9999-01-01' AND s1.salary <= s2.salary
GROUP BY s1.emp_no
ORDER BY s1.salary DESC, s1.emp_no ASC
最后在支持ROW_NUMBER、RANK、DENSE_RANK等函数的SQL Server数据库中,有以下参考代码,可惜在本题的SQLite数据库中不支持。
SELECT emp_no, salaries, DENSE_RANK() OVER(ORDER BY salary DESC) AS rank
WHERE to_date = '9999-01-01' ORDER BY salary DESC, emp_no ASC
牛客网数据库SQL实战23—— 对所有员工的薪水按照salary进行按照1-N的排名相关推荐
- 牛客网数据库SQL实战54——查找排除当前最大、最小salary之后的员工的平均工资avg_salary
牛客网数据库SQL实战54--查找排除当前最大.最小salary之后的员工的平均工资avg_salary 题目描述 查找排除当前最大.最小salary之后的员工的平均工资avg_salary. CRE ...
- sql replace替换多个字符_牛客网数据库SQL实战详细剖析(4150)
文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程.具体题目可参考牛客网的SQL实战模块:https://www.nowcoder ...
- sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)
文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程. 具体题目可参考牛客网的SQL实战模块: https://www.nowcod ...
- 牛客网数据库SQL实战45—— 将titles_test表名修改为titles_2017
牛客网数据库SQL实战45-- 将titles_test表名修改为titles_2017 题目描述 将titles_test表名修改为titles_2017. CREATE TABLE IF NOT ...
- 牛客网数据库SQL实战14—— 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。
牛客网数据库SQL实战14-- 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略. 题目描述 从titles表获取按照title进行分组,每组个数大于等于2,给出titl ...
- 牛客网数据库SQL实战25—— 获取员工其当前的薪水比其manager当前薪水还高的相关信息
牛客网数据库SQL实战25-- 获取员工其当前的薪水比其manager当前薪水还高的相关信息 题目描述 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999 ...
- 牛客网数据库SQL实战44—— 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005
牛客网数据库SQL实战44-- 将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005 题目描述 将id=5以及emp_no=10001的行数据替换成id=5以及em ...
- 牛客网数据库SQL实战60—— 统计salary的累计和running_total
牛客网数据库SQL实战60-- 统计salary的累计和running_total 题目描述 按照salary的累计和running_total,其中running_total为前两个员工的salar ...
- 牛客网数据库SQL实战答案解析下篇
部分答案来自牛客网讨论分析 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部 SELECT c.name, COUNT(fc.film_id) ...
最新文章
- 使用centos6.6部署Cobbler--自动安装centos系统
- c语言整形提升规则,C语言进阶:整型提升
- python简单代码演示效果-Python Selenium的简单演示程序
- 从零入门 Serverless | 架构的演进
- cambridge ccaf potential supervisors!
- 使用css制作三角,兼容IE6,用到的标签divsspan
- 离散数学常见面试问题总结,含答案
- 如何编写自己的python包,并进行安装和发布
- Leetcode热门100之两数之和
- 应用商店-华为应用市场
- Smartforms 总计小计
- autojs教程:贝壳赚app脚本代码
- android邮箱附件传输,Android上发送带附件的邮件
- 在互联网中,资源免费共享还能走多久!
- 自动驾驶的前世今生,能否直破未来潮流
- rt-n13u无线打印机服务器,全新体验 华硕RT-N13U雕琢无线打印生活
- 计算机网络自顶向下方法 习题参考答案 第四章
- 仿京东商城左侧商品分类导航-JS网页特效
- 【必须掌握】必须掌握的知识点
- pandas,根据某几列筛选出重复记录,is_unique与duplicated
热门文章
- 孪生素数100java_java实现孪生素数
- String字符串转数组空格处理
- [CTF]HGAME2021 WP
- 立体视觉(一)立体标定
- 数字化测图是利用计算机自动绘制地形图,数字化测图 6绘制地形图课件整理.ppt...
- 计算机设置和美化表格优质课,信息技术教案第三节:Excel工作表的编辑与美化.doc...
- 驱动学习1--USB设备驱动
- Android 荣耀手机搜不到蓝牙设备
- 二叉树的层次遍历(C语言)
- Excel如何在文字中插入函数