leetcode176题:第二高的薪水(中等)

leetcode176题:第二高的薪水(中等)

题目:

Employee表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id         | int |
| salary     | int |
+-------------+------+
其中id 是这个表的主键。表的每一行包含员工的工资信息。

查询并返回 Employee 表中第二高的不同薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)。

示例如下:

示例1:

输入Employee表

+----+--------+
| id | salary |
+----+--------+
| 1 | 100   |
| 2 | 200   |
| 3 | 300   |
+----+--------+

输出:

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

示例2:

输入Employee表

+----+--------+
| id | salary |
+----+--------+
| 1 | 100   |
+----+--------+

输出:

+---------------------+
| SecondHighestSalary |
+---------------------+
| null                 |
+---------------------+

思路:

思路1:因为是输出第二高的薪水,最直接的想法就是先按序号排序,再取出序号是2的薪水。所以先使用窗口函数根据salary的值进行从高到低排序并给上序号,再在外层select上取序号是2的值。

select 
A.salary SecondHighestSalary
from (
select
dense_rank() over (order by salary desc) num,
salary
from Employee
) A
where A.num=2

上面的语句,示例1是可以通过的,可示例2不行,因为示例2不存在第二高也就是序号2的数据,输出的结果是无数据,而题目的要求是输出null,可以加一个MAX或者MIN函数。

select 
MAX(A.salary) SecondHighestSalary
from (
select
dense_rank() over (order by salary desc) num,
salary
from Employee
) A
where A.num=2

上面的语句示例2的输出结果就是null,可通过。

思路2:第二高的薪水,如果排除第一高的薪水,剩下部分的最大值,就是原来的第二高的薪水。

select 
max(salary) SecondHighestSalary
from Employee
where salary<(select max(salary) from Employee)

以上示例1和示例2都通过,满足题目的要求。

题目来源于leetcode,点此跳转

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
小唐的头像-小唐笔记notes钻石会员
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容