SQL 18) -dense_rank 查找当前薪水排名第二多的员工

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

http://www.nowcoder.com/questionTerminal/c1472daba75d4635b7f8540b837cc719

方法)dense_rank()over()

  • 不使用order by
  • 当前薪水(to_date='9999-01-01')
SELECT e.emp_no, a.salary, e.last_name, e.first_name
FROM employees AS e JOIN ( 
    SELECT emp_no, salary, dense_rank()over(ORDER BY salary DESC)rank_num
    FROM salaries
    WHERE to_date = '9999-01-01')a
ON a.emp_no = e.emp_no
WHERE a.rank_num = 2;

21/3/24
补充方法 2)现在用order by 会报错,更换为以下的方式

  • 排除掉薪水最多的员工,那么薪水第二多的就是薪水最多的了
select e.emp_no, s.salary, e.last_name, e.first_name 
from employees as e, salaries as s
where e.emp_no = s.emp_no
and s.salary =( select max(salary) # 此时的最大值就是第二多的薪水
                from salaries where to_date = '9999-01-01' 
                and salary != (select max(salary)  # 排除掉最大值
                               from salaries 
                               where to_date = '9999-01-01'))
and s.to_date = '9999-01-01';
全部评论
为啥使用order by 会报错
1 回复 分享
发布于 2021-08-18 20:58
老哥,为啥哟啊对to_date="9999-01-01"进行判断?
点赞 回复 分享
发布于 2021-03-05 09:39
您好,也想知道为什么这题用order by就会出错呢,17题用order by 没问题, 如果用现在补充方法2,要是薪水第3多的话是还要再多写嵌套吗,小白求指点
点赞 回复 分享
发布于 2021-08-27 20:05
select a.emp_no, b.salary, a.last_name, a.first_name from employees as a inner join salaries as b on a.emp_no= b.emp_no where b.salary = (select max(salary) from salaries where salary != (select max(salary) from salaries));
点赞 回复 分享
发布于 2021-11-03 16:40

相关推荐

评论
11
2
分享

创作者周榜

更多
牛客网
牛客企业服务