我一直在寻找查询,以便从数据库中找到第三高的薪水(使用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;
答案 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。
如果您看一下该计划,就会发现它不是魔术,优化器正在使用解析函数来得出结果。
答案 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;