获取表中第N高薪水查询的方法
- 排名是数据库问题经典题目,可划分为三种场景
- 连续排名 1-2-3-4 不同薪水不同名
- 同薪,同名,排名不连续,1-2-2-4
- 同薪,同名,排名连续 ,1-2-2-3
- 本题实现第三种排名第N个结果,全局排名,不存在分组
思路1:单表排序
-
想法是用group by 按薪水进行分组,在order by排序,加limit限制得到
-
需要注意
-
同薪,同名,不跳级的问题,解决方法是用group by 按薪水分组后再order by
-
取排名第N高意味着跳过N-1个薪水,无法直接使用limit N-1,所以需要在函数开头将N为N-1
-
不能直接使用limit N-1因为offset字段只能接受正整数,或单一变量,不能是表达式
-
CREATE DEFINER=`root`@`localhost` FUNCTION `testget1`(N int ) RETURNS int -- 作者可以不用写的这么详细 BEGIN set N = N-1; RETURN ( select salary from employees group by salary order by salary desc limit N,1 ); END
-
可以靠点击也可以靠 select getNthHigestSalary(10); 写出来引用
-
思路2:子查询
-
排名第N的薪水,说明前面有N-1个比其更高的薪水
-
N-1是指去重复的N-1,实际个数可能不止N-1
-
最后返回的薪水也应该去重复
-
由于每个薪水的where田间都要执行一遍子查询,导致效率低下
-
CREATE DEFINER=`root`@`localhost` FUNCTION `getNthHigestSalary2`( N int ) RETURNS int begin return (