文巾解题 177. 第N高的薪水
Posted 刘文巾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文巾解题 177. 第N高的薪水相关的知识,希望对你有一定的参考价值。
1 题目描述
注意:数据中salary可能有重复
2 解题思路
2.1 LIMIT
这里salary可能有重复,所以为了算出答案,这里我们需要对salary进行一次grouping操作。
排名第N高意味着要跳过N-1个薪水。
但是,limit和offset字段后面只接受正整数(意味着0、负数、小数都不行)或者单一变量(意味着不能用表达式)。
也就是说想取一条,limit 2-1、limit 1.1这类的写法都是报错的。
所以需先在函数开头处理N为N=N-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
和文巾解题 176. 第二高的薪水_刘文巾的博客-CSDN博客 一样,如果我们不放心NULL的出现的话,我们也可以使用IFNULL函数:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N := N-1;
RETURN (
SELECT
IFNULL((
SELECT e.Salary
FROM Employee e
GROUP BY e.Salary
ORDER BY e.Salary DESC
LIMIT N, 1),
NULL
) AS getNthHighestSalary
);
END
2.2 子查询
1)排名第N的薪水意味着在数据集中中存在N-1个比其更高的薪水(这里的N-1个更高的薪水是指去重后的N-1个,实际对应人数可能不止N-1个。最后返回的薪水也应该去重,因为可能不止一个薪水排名第N)
2)由于对于每个薪水,都要执行一遍子查询where条件,注定这种方法效率低下
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
2.3 笛卡尔乘积
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
SELECT
e1.salary
FROM
employee e1, employee e2
WHERE
e1.salary <= e2.salary
GROUP BY
e1.salary
HAVING
count(DISTINCT e2.salary) = N
);
END
注:这里不能是N=N-1,同时e1.salary < e2.salary ,因为只有count(*)会计算NULL,count+字段会默认去掉NULL的内容。所以数据库中只有一条字段的时候,那样会报错
以上是关于文巾解题 177. 第N高的薪水的主要内容,如果未能解决你的问题,请参考以下文章