一、题目描述
表: Employee
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
Id是该表的主键列。
该表的每一行都包含有关员工工资的信息。
编写一个SQL查询来报告 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 |
+------------------------+
二、代码
代码如下:
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE offset_val INT; #定义局部变量
SET offset_val = N - 1; #赋值
RETURN (
# Write your MySQL query statement below.
SELECT DISTINCT salary # 查询salary时排除重复的行
FROM Employee
ORDER BY salary DESC #降序排序salary列
LIMIT offset_val, 1 #添加限制条件:从第offset_val开始,输出其第1行内容
);
END
三、解题思路
本题考验SQL语言中对于表的遍历,要查询自定义的第N大的salay,我们则可以以降序的方式查询salary,然后从上往下数输出第N个salary返回即可。
需要注意的是,LIMIT
子句的偏移量从 0
开始的,所以第N
大的数对应的行数应该是N-1
行。另外,为了排除输入中重复的行,需要用到DISTINCT
方法排除重复的行,避免遇到降序排序中前几个数都是一样大的情况。