题目描述
表: Employee
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
在 SQL 中,id 是该表的主键。
该表的每一行都包含有关员工工资的信息。
查询 Employee
表中第 n
高的工资。如果没有第 n
个最高工资,查询结果应该为 null
。
查询结果格式如下所示。
示例 1:
输入:
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
n = 2
输出:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
示例 2:
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
+----+--------+
n = 2
输出:
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| null |
+------------------------+
解题思路
我们可以使用 MySQL 中的 LIMIT 子句和 DISTINCT 关键字来实现这个查询。首先,我们使用 DESC 关键字对薪水进行降序排序,然后使用 LIMIT 语句获取第 n-1 条记录,并使用 DISTINCT 来去除重复值。
代码实现
MySQL 实现
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M = N - 1;
RETURN (
SELECT DISTINCT salary
FROM Employee
ORDER BY salary DESC
LIMIT M, 1
);
END
使用的时候
SELECT getNthHighestSalary(2);
**
其中,n 是输入的参数。
Pandas 实现
import pandas as pd
def nth_highest_salary(employee: pd.DataFrame, N: int) -> pd.DataFrame:
df = employee[["salary"]].drop_duplicates()
if len(df) < N:
return pd.DataFrame({'getNthHighestSalary('+ str(N) +')': [None]})
df = df.sort_values(by = 'salary', ascending=False).head(N).tail(1)
return df.rename(columns={'salary':'getNthHighestSalary('+ str(N) +')'})
**
以上是使用 Pandas 库实现的代码,首先对薪水进行降序排序,然后去除重复值。如果薪水数量少于 n,那么返回 None;否则,返回第 n-1 个薪水。