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)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容