SQL 177. 第N高的薪水

SQL 177. 第N高的薪水

  • 数据
  • 需求
  • 解决
    • 方法1
    • 方法2

题目 : 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、4
  • rank() : 同值同名,有跳级,如 : 3000、2000、2000、1000 , 排名 : 1、2、2、4
  • dense_rank() : 同值同名,无跳级,如 : 3000、2000、2000、1000 , 排名 : 1、2、2、3
  • group by 能实现去重功能 , 如 : 1 , 2 , 1 。 分组 : 1, 2
  • ifnull(值, 为 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

你可能感兴趣的:(SQL,sql,数据库,大数据,分布式,java)