随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

力扣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   我不想一直当菜鸟  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示