牛客网数据库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表进行比较排名,具体思路如下:

  1. 从两张相同的salaries表(分别为s1与s2)进行对比分析,先将两表限定条件设为to_date = ‘9999-01-01’,挑选出当前所有员工的薪水情况。
  2. 本题的精髓在于 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。其余排名以此类推。
  3. 千万不要忘了GROUP BY s1.emp_no,否则输出的记录只有一条(可能是第一条或者最后一条,根据不同的数据库而定),因为用了合计函数COUNT()
  4. 最后先以 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的排名相关推荐

  1. 牛客网数据库SQL实战54——查找排除当前最大、最小salary之后的员工的平均工资avg_salary

    牛客网数据库SQL实战54--查找排除当前最大.最小salary之后的员工的平均工资avg_salary 题目描述 查找排除当前最大.最小salary之后的员工的平均工资avg_salary. CRE ...

  2. sql replace替换多个字符_牛客网数据库SQL实战详细剖析(4150)

    文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程.具体题目可参考牛客网的SQL实战模块:https://www.nowcoder ...

  3. sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)

    文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程. 具体题目可参考牛客网的SQL实战模块: https://www.nowcod ...

  4. 牛客网数据库SQL实战45—— 将titles_test表名修改为titles_2017

    牛客网数据库SQL实战45-- 将titles_test表名修改为titles_2017 题目描述 将titles_test表名修改为titles_2017. CREATE TABLE IF NOT ...

  5. 牛客网数据库SQL实战14—— 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略。

    牛客网数据库SQL实战14-- 从titles表获取按照title进行分组,注意对于重复的emp_no进行忽略. 题目描述 从titles表获取按照title进行分组,每组个数大于等于2,给出titl ...

  6. 牛客网数据库SQL实战25—— 获取员工其当前的薪水比其manager当前薪水还高的相关信息

    牛客网数据库SQL实战25-- 获取员工其当前的薪水比其manager当前薪水还高的相关信息 题目描述 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999 ...

  7. 牛客网数据库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 ...

  8. 牛客网数据库SQL实战60—— 统计salary的累计和running_total

    牛客网数据库SQL实战60-- 统计salary的累计和running_total 题目描述 按照salary的累计和running_total,其中running_total为前两个员工的salar ...

  9. 牛客网数据库SQL实战答案解析下篇

    部分答案来自牛客网讨论分析 查找描述信息中包括robot的电影对应的分类名称以及电影数目,而且还需要该分类对应电影数量>=5部 SELECT c.name, COUNT(fc.film_id) ...

最新文章

  1. 使用centos6.6部署Cobbler--自动安装centos系统
  2. c语言整形提升规则,C语言进阶:整型提升
  3. python简单代码演示效果-Python Selenium的简单演示程序
  4. 从零入门 Serverless | 架构的演进
  5. cambridge ccaf potential supervisors!
  6. 使用css制作三角,兼容IE6,用到的标签divsspan
  7. 离散数学常见面试问题总结,含答案
  8. 如何编写自己的python包,并进行安装和发布
  9. Leetcode热门100之两数之和
  10. 应用商店-华为应用市场
  11. Smartforms 总计小计
  12. autojs教程:贝壳赚app脚本代码
  13. android邮箱附件传输,Android上发送带附件的邮件
  14. 在互联网中,资源免费共享还能走多久!
  15. 自动驾驶的前世今生,能否直破未来潮流
  16. rt-n13u无线打印机服务器,全新体验 华硕RT-N13U雕琢无线打印生活
  17. 计算机网络自顶向下方法 习题参考答案 第四章
  18. 仿京东商城左侧商品分类导航-JS网页特效
  19. 【必须掌握】必须掌握的知识点
  20. pandas,根据某几列筛选出重复记录,is_unique与duplicated

热门文章

  1. 孪生素数100java_java实现孪生素数
  2. String字符串转数组空格处理
  3. [CTF]HGAME2021 WP
  4. 立体视觉(一)立体标定
  5. 数字化测图是利用计算机自动绘制地形图,数字化测图 6绘制地形图课件整理.ppt...
  6. 计算机设置和美化表格优质课,信息技术教案第三节:Excel工作表的编辑与美化.doc...
  7. 驱动学习1--USB设备驱动
  8. Android 荣耀手机搜不到蓝牙设备
  9. 二叉树的层次遍历(C语言)
  10. Excel如何在文字中插入函数