17.获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

http://www.nowcoder.com/questionTerminal/8d2c290cc4e24403b98ca82ce45d04db

法一:row_number开窗函数(当薪水第二的人有多个时只会输出一个)

select emp_no,salary
from
(select emp_no,salary,row_number() over(order by salary desc) t
from salaries
where to_date='9999-01-01')
where t=2

法二:rank开窗函数(当薪水第二的人有多个时会全部输出)

select emp_no,salary
from
(select emp_no,salary,rank() over(order by salary desc) t
from salaries
where to_date='9999-01-01')
where t=2

法三:max()+子查询

select emp_no,max(salary)
from salaries
where salary <>(select max(salary)
from salaries
where to_date='9999-01-01')
数据分析阿宇君的SQL题解 文章被收录于专栏

数据分析的SQL题目

全部评论
窗口函数用的不严谨,没有考虑薪水相同的情况,如果把row_number()换成dense_rank()就没漏洞了
32 回复 分享
发布于 2020-10-05 16:17
法一法二用窗口函数,临时表必须有别名!
18 回复 分享
发布于 2020-11-09 16:36
如果有两个并列第一,两个并列第二:rank()是跳跃排序,结果是1133;dense_rank()是连续排序,结果是1122;row_number连续且唯一,结果是1234。所以dense_rank()最合适。
16 回复 分享
发布于 2021-01-31 22:18
答主,我记得 rank()排序是 1,1,3 这样的。当薪水排第一的人有多个人的时候,薪水排第二的人就不会显示 2 了。。
12 回复 分享
发布于 2021-01-18 19:12
感觉法三不是特别对,select emp_no,max(salary) from salaries; max() 能获取到salary 的最大值,但应该不能保证此时的emp_no,恰好是最大值salary 对应的emp_no。 希望能得到楼主的解答
7 回复 分享
发布于 2020-09-08 15:59
三个都是错的,你是怎么做到的?
6 回复 分享
发布于 2021-09-02 15:24
上面有几个评论已经提到了。这里总结一下: 解法一:最高工资有多人时出错,会错误地选出最高的工资。 解法二:最高工资有多人时出错,rank() 的结果可能没有2 综上,如果用窗口函数只能用dense_rank()
5 回复 分享
发布于 2021-03-28 18:40
太秀了,能想出三种方法还都有问题
4 回复 分享
发布于 2022-01-13 11:32
秀儿
2 回复 分享
发布于 2020-10-21 13:16
解法三是错的,我觉得应该再套一层子查询 SELECT emp_no, salary FROM salaries WHERE salary = ( select max(salary) as salary from salaries where salary <> ( select max(salary) from salaries where to_date='9999-01-01' ) );
2 回复 分享
发布于 2021-07-24 21:22
解法二没有给临时表命名,会报错的
2 回复 分享
发布于 2022-07-20 21:17
你好,开窗函数在引用的时候必须用子查询,否则无法引用开窗函数, (select emp_no,salary,rank() over(order by salary desc) t from salaries where to_date='9999-01-01') as A where A.t=2 就对了
1 回复 分享
发布于 2021-09-25 13:10
解法二出错
点赞 回复 分享
发布于 2021-08-09 22:47
请问max()取出来的值为什么不能直接比较呢?比如salary
点赞 回复 分享
发布于 2021-08-20 10:04
解法三,子查询出来的第二大的值的emp_no 和 第二大值对不上
点赞 回复 分享
发布于 2021-08-30 12:14
三种方法都错了,测试都报错
点赞 回复 分享
发布于 2022-03-06 16:03
dense_rank
点赞 回复 分享
发布于 2022-03-22 10:26
为什么一定要用where那个日期
点赞 回复 分享
发布于 2022-04-22 16:11
严谨点,densrank;解法二看出了语法基础不牢
点赞 回复 分享
发布于 2022-05-16 16:27
为什么这道题使用窗口函数不用指定salary字段分区呢
点赞 回复 分享
发布于 2022-09-05 13:14 陕西

相关推荐

喜欢走神的孤勇者练习时长两年半:池是池,发是发,我曾池,我现黑
点赞 评论 收藏
分享
尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
评论
133
9
分享
牛客网
牛客企业服务