编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。
测试数据
+----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+
例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null。
+------------------------+ | getNthHighestSalary(2) | +------------------------+ | 200 | +------------------------+
首先拿到题直接思考使用分析函数了,是使用
row_number()
还是dense_rank()
row_number() over()是无论值是否相同值始终递增
100 1 200 2 200 3 300 4
dense_rank() over()是重复的值显示的排名都相同,但其后的值跟着上一个值递增,不跳跃
100 1 200 2 200 2 300 3
rank() over()则是重复值的排名相同,但其后的值从重复行数开始递增,跳跃式
100 1 200 2 200 2 300 4
题解
CREATE FUNCTION getNthHighestSalary(N IN NUMBER) RETURN NUMBER IS result NUMBER; BEGIN /* Write your PL/SQL query statement below */ SELECT a.salary into result from ( select dense_rank() over(order by Salary desc) as rank,Salary from Employee )a where a.rank = N; RETURN result; END;