ORACLE SQL第二个最高薪水[重复]

Posted

技术标签:

【中文标题】ORACLE SQL第二个最高薪水[重复]【英文标题】:ORACLE SQL Second Maximum Salary [duplicate] 【发布时间】: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 

【问题讨论】:

是的。您能否提供您试图从中找到第二个最高薪水的示例行? 至少提供表格 【参考方案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。而不是下一个。

以上是关于ORACLE SQL第二个最高薪水[重复]的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-SQL-第二高的薪水

获取薪水第二高的员工姓名[重复]

4不准用组函数(Max),取得最高薪水bjpowernode34道SQL题

[LeetCode] Nth Highest Salary 第N高薪水

文巾解题 176. 第二高的薪水

Oracle HR 模式。从员工中选择最高工资