这与您之前的问题几乎相同,或者至少答案与您得到的答案相似:
select fname, salary
from (
select fname, salary,
dense_rank() over (order by salary desc) as rn
from employee
where dept_id=1002
)
where rn = 3;
dense_rank()
是一种分析函数,可为您提供无间隙排名。rownum
伪列或“高级”row_number()
分析函数 和rank()
,做类似的事情,但不同地对待关系。
使用rownum
/ row_number()
,两个具有相同薪水的记录将以任意顺序返回,具有不同的“排名”,即您将始终拥有排名为 1、2、3、4、5、6 的记录,即使是平局。
使用rank()
时,将返回具有相同薪水的两条记录,并具有相同的排名值,并且排名值与下一个值之间会有差距salary
。因此,您可能会获得 1、1、1、4、4、6 的排名——所有三个排名为“1”的记录都具有相同的薪水,并且两个记录都排名“4”具有相同的薪水。在分配相同等级的记录中,排序仍然是任意的。
使用dense_rank()
,将返回具有相同薪水的两条记录并具有相同的排名值,并且“排名”值与下一个值之间不会salary
有差距。因此,您可能会得到 1、1、1、2、2、3 的排名——所有三个排名为“1”的记录都具有相同的薪水,并且两个记录都排名“2”具有相同的薪水。在分配相同等级的记录中,排序仍然是任意的。
使用 CTE 中的一些示例数据:
with t as (
select 20000 as salary from dual
union all select 30000 from dual
union all select 40000 from dual
union all select 30000 from dual
union all select 40000 from dual
union all select 40000 from dual
)
select salary,
row_number() over (order by salary desc) as row_num,
rank() over (order by salary desc) as r,
dense_rank() over (order by salary desc) as dr
from t;
SALARY ROW_NUM R DR
---------- ---------- ---------- ----------
40000 1 1 1
40000 2 1 1
40000 3 1 1
30000 4 4 2
30000 5 4 2
20000 6 6 3
6 rows selected.
你rank()
可能没有任何排名为3
; 与dense_rank()
您同级别的可能不止一个。row_number()
将有一个,但如果有关系,您将不知道它是否实际上是第三高的。您需要确定哪些匹配您要执行的操作。