SQL 177. 第N高的薪水
题目 : https://leetcode.cn/problems/nth-highest-salary/
数据
Create table If Not Exists Employee (Id int comment '主键列', Salary int comment '工资'
);Truncate table Employee;insert into Employee (id, salary) values ('1', '100');
insert into Employee (id, salary) values ('2', '200');
insert into Employee (id, salary) values ('3', '300');
需求
查询 Employee 表中第 n 高的工资
- 当没有第 n 个最高工资,就返回为 null
查询结果 :
输出:
| getNthHighestSalary(2) |
| 200 |输出:
| getNthHighestSalary(2) |
| null |
解决
技术点 :
row_number()
: 同值不同名,类似行号,如 : 3000、2000、2000、1000 , 排名 : 1、2、3、4rank()
: 同值同名,有跳级,如 : 3000、2000、2000、1000 , 排名 : 1、2、2、4dense_rank()
: 同值同名,无跳级,如 : 3000、2000、2000、1000 , 排名 : 1、2、2、3group by
能实现去重功能 , 如 : 1 , 2 , 1 。 分组 : 1, 2ifnull(值, 为 null 返回)
: 当第 1 个参数为 null , 就返回第 2 个参数值
方法1
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGINRETURN (# 写SQL-- 对薪水进行排序with t1 as (selectSalary,dense_rank() over(order by Salary desc) as Salary_rkfrom Employee),-- 筛选第 N 的薪水 ,并去重t2 as (selectSalaryfrom t1where Salary_rk = Ngroup by Salary)-- 判断是否为空select ifnull((selectSalaryfrom t2), null));
END
方法2
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN-- limit 要少 1set N = N - 1;RETURN (# 写SQL-- 对薪水去重-- 对薪水排序-- 选择 N + 1 名的薪水with t1 as (select Salaryfrom Employeegroup by Salaryorder by Salary desclimit N, 1)-- 判断 nullselect ifnull((select Salary from t1),null));
END