Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode>第N高的薪水
表:Employee
Column Name | Type |
---|---|
id | int |
salary | int |
Id是该表的主键列。 该表的每一行都包含有关员工工资的信息。
编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询应该报告为null 。
查询结果格式如下所示。
示例 1:
输入: Employee table:
id | salary |
---|---|
1 | 100 |
2 | 200 |
3 | 300 |
n = 2
输出:
getNthHighestSalary(2) |
---|
200 |
示例 2:
输入: Employee 表:
id | salary |
---|---|
1 | 100 |
n = 2
输出:
getNthHighestSalary(2) |
---|
null |
二、思路分析:
-
获取第二高的薪水,首先会想到使用排序order by,默认是asc,即从小到大,若想降序则使用关键字 desc
-
当出现多个相同的数据时,需要去重,使用distinct
-
当不存在第N个数据时,需要返回null,则需要使用IFNULL方法
-
起别名,则需要使用关键字as
-
基于以上条件,可以使用limit对指定数据进行取用
-
第N高的薪水,其实是取第二高薪水的题目变形,主要核心还是在limit的使用上
三、AC 代码:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N = N - 1;
RETURN (
SELECT IFNULL((
SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC LIMIT N,1),null) AS getNthHighestSalary
);
END
四、总结:
-
limit后不能跟运算,所以需要提前对N的值做处理。
-
limit a,b:跳过a条取出b条数据
-
distinct 去重
-
order by 排序