【SQL20】查询第二高的薪水

查询第二高的薪水

编写一个 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);

猜你喜欢

转载自blog.csdn.net/debimeng/article/details/104160445