力扣177(MySQL)-第N高的薪水(中等)

题目:

表: Employee

编写一个SQL查询来报告 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询应该报告为 null 。

查询结果格式如下所示

示例1:

 示例2:

解题思路:

方法一:

①需要考虑有相同薪水的情况,相同薪水排名一样但是求第n高是需要跳过重复薪水的,因此可以使用group by salary 或者使用distinct 。【group by 把重复的合为一组,也能起到去重的作用】

②排名第N高,需要跳过 N- 1,如果使用 LIMIT 和 OFFSET 没法直接使用 LIMIT N-1,因为 LIMIT 和 OFFSET 后面只能接受正整数(0、负数、小数、表达式都不行)

 1 CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
 2 BEGIN
 3   SET N := N - 1;
 4   RETURN (
 5       # Write your MySQL query statement below.
 6       select distinct salary
 7       from Employee
 8       order by salary desc
 9       limit N,1
10   );
11 END

方法二:

使用聚合函数:dense_rank() over(order by),对薪资进行降序连续排序,例如:1,2,2,3...

 1 CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
 2 BEGIN
 3   RETURN (
 4       # Write your MySQL query statement below.
 5       select distinct  salary
 6       from (
 7           select 
 8             salary, dense_rank() over(order by salary desc) as rnk
 9           from Employee
10       ) as a 
11       where rnk = N
12   );
13 END

小知识:

①赋值方法:

‘=’ 和 := 都是赋值操作符

 ②limit用法

limit n :从第一行开始,输出n行数据

例如:select * from test LIMIT 3 ; 提取前三条数据

limit m,n:从第m+1行开始,输出n行数据

例如:select * from test LIMIT 2,3; 从第三行开始提取三行数据即3,4,5行数据

limit m offset n:从第n+1行开始,输出m行数据

例如:select * from test LIMIT 3 offset 4;从第四行的下一行开始向下取3条数据即5,6,7行数据

posted on 2023-03-20 17:09  我不想一直当菜鸟  阅读(71)  评论(0编辑  收藏  举报