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()最合适。
17 回复 分享
发布于 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 回复 分享
发布于 2022-07-20 21:17
解法三是错的,我觉得应该再套一层子查询 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 回复 分享
发布于 2020-10-21 13:16
你好,开窗函数在引用的时候必须用子查询,否则无法引用开窗函数, (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
窗口函数 row_number()与rank都错了,row_number无法取出多个相同第二名的,rank排序有间断点,如果第一名有多个,根本无法取到第二名,这里应该用 dense_rank,没有间断点的排序
点赞 回复 分享
发布于 2024-01-17 15:43 浙江
应该用 dense_rank()
点赞 回复 分享
发布于 2023-06-11 15:34 浙江
为什么我在最后加上order by emp_no之后就报错呢
点赞 回复 分享
发布于 2022-10-05 18:18 浙江
为什么这道题使用窗口函数不用指定salary字段分区呢
点赞 回复 分享
发布于 2022-09-05 13:14 陕西
严谨点,densrank;解法二看出了语法基础不牢
点赞 回复 分享
发布于 2022-05-16 16:27
为什么一定要用where那个日期
点赞 回复 分享
发布于 2022-04-22 16:11
dense_rank
点赞 回复 分享
发布于 2022-03-22 10:26
三种方法都错了,测试都报错
点赞 回复 分享
发布于 2022-03-06 16:03

相关推荐

不愿透露姓名的神秘牛友
07-02 17:58
点赞 评论 收藏
分享
程序员牛肉:这一眼假啊,基本上都是骗人的,不然就涉及到职位贪腐了,就像之前华为的OD事件,看你运气好不好了
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
评论
133
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务