編寫 SQL 查詢獲取 Employee 表第 N 高薪水。不存在時返回 NULL。
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
N=2 時返回 200。
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
原理:去重後降序,LIMIT offset, 1 取第 offset+1 行。N=1 → offset=0 取最高;N=2 → offset=1 取第二高。
SELECT DISTINCT Salary
FROM (
SELECT Salary,
DENSE_RANK() OVER (ORDER BY Salary DESC) AS rnk
FROM Employee
) t
WHERE rnk = N
LIMIT 1;
DENSE_RANK 完美處理並列薪水(如 300,300,200 → 排名 1,1,2),無間隔。
SELECT DISTINCT Salary
FROM Employee e1
WHERE N = (
SELECT COUNT(DISTINCT Salary)
FROM Employee e2
WHERE e2.Salary >= e1.Salary
);
統計有多少不同薪水 ≥ 當前薪水,等於 N 即為第 N 高。
INDEX (Salary DESC)