题目 : 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
BEGIN
RETURN (
# 写SQL
-- 对薪水进行排序
with t1 as (
select
Salary,
dense_rank() over(order by Salary desc) as Salary_rk
from Employee
),
-- 筛选第 N 的薪水 ,并去重
t2 as (
select
Salary
from t1
where Salary_rk = N
group by Salary
)
-- 判断是否为空
select ifnull((
select
Salary
from t2
), null)
);
END
方法2
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
-- limit 要少 1
set N = N - 1;
RETURN (
# 写SQL
-- 对薪水去重
-- 对薪水排序
-- 选择 N + 1 名的薪水
with t1 as (
select Salary
from Employee
group by Salary
order by Salary desc
limit N, 1
)
-- 判断 null
select ifnull((
select Salary from t1),
null
)
);
END