欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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);