甲骨文第三高薪

时间:2014-06-23 17:38:54

标签: oracle oracle-sqldeveloper

我一直在寻找查询,以便从数据库中找到第三高的薪水(使用Oracle数据库)。我找到了以下查询 -

SELECT *
FROM
  ( SELECT e.*, row_number() over (order by sal DESC) rn FROM emp e
  )
WHERE rn = 3;

我的系统中没有安装oracle,所以我没试过。但我想知道以下查询是否有效。如果没有,那么为什么?

WITH Sal_sort AS
  (SELECT DISTINCT sal FROM salary ORDER BY sal DESC
  )
SELECT * FROM Salary S, Sal_sort SS WHERE S.Sal = SS.Sal AND SS.rownum = 3;

4 个答案:

答案 0 :(得分:1)

输入数据

emp_no  emp_fname   emp_lname   salary
1   aa                      bb                      30  
2   ee                      yy                      31  
3   rr                      uu                      32  
4   tt                      ii                      33  
5   tt                      ii                      33  
6   tt                      ii                      33  
7   tt                      ii                      33  
8   tt                      ii                      30  
9   tt                      ii                      31  

示例:

select * from ee;
select emp_no,salary ,dense_rank() over (order by salary  ) dr
from ee

<强>输出

emp_no  salary  dr
1        30     1
8        30     1
9        31     2
2        31     2
3        32     3
4        33     4
5        33     4
6        33     4
7        33     4

答案 1 :(得分:0)

仅一行

select * from (
select salary,dense_rank() over (order by salary desc) rank from  employees) where rank=3;

select * from (
select a.*,dense_rank() over (order by a.salary desc) rank from  employees a) where rank=3;

答案 2 :(得分:0)

在数据库的第12版和现在的更高版本中,这要容易得多。

SELECT *
  FROM employees
 ORDER BY salary DESC OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY

Tim讨论了此功能here

如果您看一下该计划,就会发现它不是魔术,优化器正在使用解析函数来得出结果。

enter image description here

答案 3 :(得分:0)

没有Dense_rank()

SELECT salary FROM employees
ORDER BY salary DESC
OFFSET 2
FETCH 1 NEXT ONE ROWS ONLY;

使用Dense_rank()

SELECT salary 
FROM
(
SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) as rank from employees
)
WHERE rank = 3;