如何修改SQL函数实现存在重复薪资时正确返回第N高薪资
错误原因
原代码存在两处核心逻辑缺陷:
- 直接通过id关联计算排名,没有和薪资的排序规则挂钩,若薪资不随id递增会直接返回错误结果
- 未对薪资做去重排名处理,相同薪资会被算作不同的排名位,重复薪资场景下无法得到正确结果
修复代码
适配MySQL等支持LIMIT语法的数据库
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN -- LIMIT偏移从0开始,第N高对应偏移量为N-1 SET N = N - 1; RETURN ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT N, 1 ); END
适配题目提到的SQL Server数据库
SQL Server不支持LIMIT语法,使用窗口函数DENSE_RANK实现更合理:
CREATE FUNCTION getNthHighestSalary(@N INT) RETURNS INT AS BEGIN RETURN ( SELECT TOP 1 Salary FROM ( SELECT Salary, DENSE_RANK() OVER(ORDER BY Salary DESC) AS rank_num FROM Employee ) AS temp WHERE rank_num = @N ); END
适配性说明
- 针对所有薪资相同的测试用例,去重后仅存在1个薪资档位,当N>1时查询无匹配结果,返回NULL符合要求
DENSE_RANK窗口函数会给相同薪资分配相同的排名,不会占用多个排名位,完全符合“第N高薪资”的统计逻辑- 若需要更严谨的边界处理,可增加对N<1的判断,直接返回NULL即可
内容的提问来源于stack exchange,提问作者wydncwymsjgcs
相关产品推荐
相关产品推荐

