YMLiang

编写一个 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;
    

 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 , 总访问量为 次 。
Copyright 2018-2019 YMLiang'BLOG   |   京ICP备 - 19039949  |  载入天数...载入时分秒...