LeetCode(数据库)- 第N高的薪水

【摘要】 题目链接:点击打开链接
 
题目大意:略。
 
解题思路:
解决方案 (1):单表查询、Limit解决方案 (2):子查询、算出每个当前薪水不被超过其他薪水的个数就是它的排名(当前:指的是 FROM 的表的 salary)解决方案 (3):自连接(或笛卡儿积)、和解决方案(2)思路一样,当前薪水不被超过其他薪水的个数就是它的排名(当前:分组里的表 salary)解决…

题目链接:点击打开链接

题目大意:略。

解题思路:

  • 解决方案 (1):单表查询、Limit
  • 解决方案 (2):子查询、算出每个当前薪水不被超过其他薪水的个数就是它的排名(当前:指的是 FROM 的表的 salary)
  • 解决方案 (3):自连接(或笛卡儿积)、和解决方案(2)思路一样,当前薪水不被超过其他薪水的个数就是它的排名(当前:分组里的表 salary)
  • 解决方案 (4):自定义变量、先按照 salary 降序,再类似 for 循环罗列好每个的薪水的排名就能最后求出第N个薪水的答案;这里 FROM 后面的 init 只是个表别名,为了初始化数据罢了
  • 解决方案 (5):窗口函数、思路和解决方案(4)一样,只是借用函数来解决

注意:【窗口函数】

实际上,在mysql8.0中有相关的内置函数,而且考虑了各种排名问题:

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
ntile(): 分桶排名,即首先按桶的个数分出第一二三桶,然后各桶内从1排名,实际不是很常用
显然,本题是要用第三个函数。
另外这三个函数必须要要与其搭档over()配套使用,over()中的参数常见的有两个,分别是

partition by,按某字段切分
order by,与常规order by用法一致,也区分ASC(默认)和DESC,因为排名总得有个依据
注:下面代码仅在mysql8.0以上版本可用,最新OJ已支持。

AC 代码


-- 解决方案 (1)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N := N-1;
RETURN (
# Write your MySQL query statement below.
SELECT
salary
FROM
employee
GROUP BY
salary
ORDER BY
salary DESC
LIMIT N, 1
);
END
-- 解决方案 (2)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
SELECT
DISTINCT e.salary
FROM
employee e
WHERE
(SELECT count(DISTINCT salary) FROM employee WHERE salary>e.salary) = N-1
);
END
-- 解决方案 (3)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
SELECT
e1.salary
FROM
employee e1 JOIN employee e2 ON e1.salary <= e2.salary
GROUP BY
e1.salary
HAVING
count(DISTINCT e2.salary) = N
);
END
-- 解决方案 (4)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
SELECT
DISTINCT salary
FROM
(SELECT
salary, @r:=IF(@p=salary, @r, @r+1) AS rnk, @p:= salary
FROM
employee, (SELECT @r:=0, @p:=NULL) init
ORDER BY
salary DESC) tmp
WHERE rnk = N
);
END
-- 解决方案 (5)
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
SELECT
DISTINCT salary
FROM
(SELECT
salary, dense_rank() over(ORDER BY salary DESC) AS rnk
FROM
employee) tmp
WHERE rnk = N
);
END

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享