【问题标题】:ORACLE SQL Second Maximum Salary [duplicate]ORACLE SQL第二个最高薪水[重复]
【发布时间】:2017-12-29 06:02:30
【问题描述】:

如何从员工表中找到员工提取的第二个最高工资。是否可以通过 ROWNUM 函数找到。

示例表:

S.no    Name       employee_id     salary
201     Steven        100            1000
202     Alexander     101            2500 
203     Daniel        102            5000
204     John          103            3000
205     Ishanth       104            8000 

【问题讨论】:

  • 是的。您能否提供您试图从中找到第二个最高薪水的示例行?
  • 至少提供表格

标签: sql oracle top-n


【解决方案1】:

既然你提到了第二高的薪水,你应该使用DENSE_RANK而不是ROW_NUMBER,如果有两个员工的最高值相同,即使你给出WHERE ROW_NUMBER = 2条件也会错误地给你最高薪水.

SELECT A.S_NO, A.NAME, A.EMPLOYEE_ID, A.SALARY
FROM
    (SELECT S_NO, NAME, EMPLOYEE_ID, SALARY, 
     DENSE_RANK() OVER (ORDER BY SALARY DESC) AS SALARY_RANK) A
WHERE A.SALARY_RANK = 2;

【讨论】:

  • 不知道为什么有人不赞成这个,这是一个非常好的答案。
  • 这令人沮丧!
  • 我要提到的唯一解决方法是添加缺少的FROM,如AS SALARY_RANK FROM A)。这为我的实施提供了正确答案。
【解决方案2】:

试试这个

SELECT salary FROM (SELECT DISTINCT salary FROM Employees  ORDER BY salary 
DESC) WHERE ROWNUM=2;

在哪里,

  • salary 是列名
  • Employees 是表名

获取第二个最高薪水和第n个薪水的最简单方法

select 
 DISTINCT(salary) 
from Employees 
 order by salary desc 
limit 1,1

注意:

limit 0,1  - Top max salary

limit 1,1  - Second max salary

limit 2,1  - Third max salary

limit 3,1  - Fourth max salary

预言机更新

SELECT salary FROM (
    SELECT salary, row_number() OVER (order by salary desc) AS rn FROM Employees
)
WHERE rn = 2

【讨论】:

  • 赞成,但 oracle 不支持 limit
  • 您正在为这个问题添加 sql 标签。这就是我在 sql 中给出这个答案的原因。请在oracle中找到一种限制方法
  • @APC 我已经更新了我的答案。
  • @Rams 我已经更新了我的答案
  • ROWNUM=2 不像你想象的那样工作;该查询将返回 行。
【解决方案3】:

使用一般查询获取最大 nth 薪水:

select salary from table_name order by salary desc limit n-1,1;

【讨论】:

    【解决方案4】:

    而不是使用 ROWNUM 。您可以通过

    轻松找到第 'n' 个薪水
    SELECT *
      FROM (
      SELECT DISTINCT  salary 
      FROM Employees
      ORDER BY salary DESC limit 2
      ) a
    ORDER BY a.salary limit 1
    

    在这里,您可以给出所需的任何“n”值,而不是“2”。

    【讨论】:

      【解决方案5】:

      我猜,你可以在这里使用 Nth_Value 函数 语法请参考https://docs.oracle.com/cloud/latest/db112/SQLRF/functions114.htm#SQLRF30031

      select distinct 
      nth_value(salary,2) OVER (ORDER BY salary desc range between unbounded preceding and unbounded following) as secondVal 
      from HR.EMPLOYEES;
      

      另一种选择,如下使用 DENSE_RANK 函数

      with cte as (
          select salary, dense_rank() over (order by salary desc) as nth_salary from Employee
      )
      select salary from cte 
      where 
          nth_salary = 2;
      

      这是输出

      【讨论】:

      • 如果有两个员工的薪水最高会怎样?
      • 假设如果有两个最大值,假设前 2 个薪水与 100 相同,则此查询将返回 100。而不是下一个。
      猜你喜欢
      • 2013-12-04
      • 2011-12-20
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2015-03-09
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多