VIRTUALS

the virtual labs for the virtuals

0%

LeetCode 177. 第N高的薪水

摘要:
数据库TopK问题,各种情况和对应方法。

题目

LeetCode 177. 第N高的薪水

单表查询

1
2
3
4
5
6
7
8
9
10
11
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 1 offset n
);
END

将所有数据按照salary分组,并按照salary由高到低排序。
再选取一条数据。
又因为我们需要从最高开始第 $N$ 高数据,根据 offset 使用规则,需要偏移 $N - 1$ 位。
因为 offset 后面不能跟表达式,只可以跟变量或数字,所以需要提前将 $N$ 设为 $N - 1$.

该方法效率中等。

子查询

1
2
3
4
5
6
7
8
9
10
11
12
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

这个方法目前无法理解,主要是子查询中的 where条件。