【SQL】查询第二高的薪水
程序员文章站
2022-07-07 09:43:16
...
查询第二高的薪水
编写一个 SQL 查询,获取Employee 表中第二高的薪水(Salary)
id salary
1 100
2 200
3 300
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
结果如下:
200
解决:
首先来看看常用排序函数之间的数据是什么样的
select salary
,row_number() over(order by salary) as rn
,rank() over(order by salary) as rankn
,dense_rank() over(order by salary) as dense_rn
from salary
;
salary rn rankn dense_rn
100 1 1 1
100 2 1 1
200 3 3 2
200 4 3 2
300 5 5 3
300 6 5 3
由此也可以看出row_number、rank和dense_rank的区别:
row_number会给每行数据生成一个序号,每个序号都不一样,不管排序字段值是否相同;
rank也是每行生成一个序号,区别在如果排序字段值相同的话,其序号一样,整体的序号不连续,即会跳跃序号;
dense_rank也是每行生成一个序号,如果排序字段值相同的话,其序号一样,但其整体的序号是连续的,即不会跳跃序号;
最后的SQL:
select salary
from (
select salary
,dense_rank() over(order by salary) as dense_rn
from salary
)a
where dense_rn = 2
group by salary
;
200
考虑以后如果有同样的薪水,这样就不能使用row_number函数了,所以这次使用了dense_rank函数
备注:建表和数据
create table salary(id int,salary int);
insert into salary values(1,100);
insert into salary values(2,200);
insert into salary values(3,300);
insert into salary values(4,200);
insert into salary values(5,300);