文章目录
  1. 1. 题目
  2. 2. 注意事项
  3. 3. 解题思路
  4. 4. 构造测试数据
  5. 5. 一种答案

题目

#177 Nth Highest Salary

注意事项

  • Salary 排序要求是,例如前两名 Salary 相同,那么接着第三人 Salary 排名是 2

    所以计算排名的方法有三种情况

  • 不能直接 WHERE Ranking = N,因为 SQL 计算顺序是 FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

    临时列 Ranking 在计算 WHERE 时这个列尚未生成,所以需要再在外层 SELECT 一次

  • 相同的 Salary 可能有多个,要加 DISCTINCT 去除重复值

解题思路

非常熟悉的 Ranking 类题目,解题方法就是使用自定义变量计算排名。这个题目应该比较简单,可能因为编号靠前所以通过率倒数第二。

构造测试数据

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE IF NOT EXISTS Employee (
Id INT,
Salary INT
);

DELETE FROM Employee;

INSERT INTO Employee VALUES
(1, 100),
(2, 200),
(3, 300),
(4, 200);

一种答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- Runtime: 992 ms
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
RETURN (
# Write your MySQL query statement below.
SELECT DISTINCT
Salary
FROM
(SELECT
Id,
Salary,
@rowNum:=IF(Salary < @prevVal, @rowNum + 1, @rowNum) AS Rank,
@prevVal:=Salary
FROM
Employee, (SELECT @rowNum:=1) x, (SELECT @prevVal:=0) y
ORDER BY Salary DESC) tmp
WHERE
Rank = N
);
END

内层查询语句是:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
Id,
Salary,
@rowNum:=IF(Salary < @prevVal,
@rowNum + 1,
@rowNum) AS Rank,
@prevVal:=Salary
FROM
Employee,
(SELECT @rowNum:=1) x,
(SELECT @prevVal:=0) y
ORDER BY Salary DESC

其结果:

Id Salary Rank @prevVal:=Salary
3 300 1 300
2 200 2 200
4 200 2 200
1 100 3 100

第二步只是增加 WHERE Rank = N 和去除不需要的列


本博客微信公众号

文章目录
  1. 1. 题目
  2. 2. 注意事项
  3. 3. 解题思路
  4. 4. 构造测试数据
  5. 5. 一种答案