177第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 |
+------------------------+
解题思路
这道题和第2高的薪水是一样的,不一样的是这道题给的是一个方法,因为正常很少去用mysql方法的,所以可能很多人不知道怎么写了。如下:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
);
END
解法一:
这道题很简单,最简单的思路就是order by按照salary desc降序排列,然后去除重复 limit 取出 N-1,1的数据。但是排名第N高意味着要跳过N-1个薪水,由于无法直接用limit N-1,所以需先在函数开头处理N为N=N-1。
注:这里不能直接用limit N-1是因为limit和offset字段后面只接受正整数(意味着0、负数、小数都不行)或者单一变量(意味着不能用表达式),也就是说想取一条,limit 2-1、limit 1.1这类的写法都是报错的。
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N = N-1;
RETURN (
# Write your MySQL query statement below.
select distinct(salary) as getNthHighestSalary from Employee order by salary desc limit N,1
);
END
解法二:
跟第二高的薪水解法一样,使用子查询查询出,这种方式麻烦一点,但是如果遇到第176题,第一种方式在只有一条数据或者没有数据的情况下返回不了null,但是在mysql环境下可以返回,是力扣的问题,这时使用第二种方式就不会报错。
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set N = N-1;
RETURN (
# Write your MySQL query statement below.
select (select distinct salary from Employee order by salary desc limit N,1) as getNthHighestSalary
);
END
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/nth-highest-salary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。