【问题标题】:how to find second and third highest salary in SQL? [duplicate]如何在 SQL 中找到第二和第三高薪水? [复制]
【发布时间】:2020-01-29 19:04:10
【问题描述】:

如何在 SQL 中找到第二和第三高的薪水?

我试过这个语法:

SELECT FIRST_NAME, SALARY
FROM EMPLOYEES E1 WHERE 2-1 = (SELECT COUNT(DISTINCT SALARY)
                               FROM EMPLOYEES E2
                               WHERE E1.SALARY > E2.SALARY);

但我需要获得第二和第三的最高薪水?

【问题讨论】:

  • 提示:使用row_number()rank()
  • 看看NTH_VALUE

标签: sql database oracle


【解决方案1】:

简单的逻辑尝试先找到最高薪水,然后从中找到低于最高薪水

Select Max(SALARY)            // Third Highest
FROM EMPLOYEES 
where 
SALARY<(Select Max(SALARY)          // Second Highest Salary
From EMPLOYEES 
Where 
SALARY < (Select Max(Salary)      // Highest Salary
From Employees))

【讨论】:

  • 我认为您需要在中间子查询中使用 MAX(salary) 才能使其成为有效的解决方案......如果您想要 Nth 最高值,则随着您增加 N 的比例会很差.
  • 是的,有点错字。我编辑了答案:D
【解决方案2】:

我不知道你的桌子是如何设置的,但假设SALARYFIRST_NAME 的收入...

WITH
    theRank AS
    (
        SELECT
            FIRST_NAME,
            SALARY

        FROM
            EMPLOYEES

        ORDER BY SALARY DESC
    )

    SELECT
        *
    FROM
        theRank
    WHERE
        rownum = 3 -- change to the top X you want

这首先按工资降序对所有员工进行排序,然后,您可以选择您想要的顶部的数量。

【讨论】:

  • 这不会返回任何行,因为薪水最高的行将针对ROWNUM = 3 过滤器和1 = 3 进行测试,因此该行将被丢弃,然后将测试第二高的行并,因为前一行将被丢弃,ROWNUM 也将给出 1 并且再次,1 = 3 为假,该行将被丢弃......对所有行重复,你会得到一个空的结果集。
【解决方案3】:

你可以使用order by和limit函数。

SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
ORDER BY SALARY DESC
LIMIT 3

干杯

【讨论】:

  • 这似乎是 MYSQL 语法,但 OP 想要在 ORACLE 中使用它。
【解决方案4】:

试试看:


with cte as 
SELECT row_number() over (partition by employeename order by salary desc  )rk ,FIRST_NAME, SALARY
FROM EMPLOYEES )
select * from cte where rk in (2,3)

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多