これは前の質問とほとんど同じです、または少なくとも答えはあなたがそのために得たものと似ています:
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()
すると、同じ給与の2つのレコードが任意の順序で返され、「ランク」が異なります。つまり、同点の場合でも、常に1、2、3、4、5、6のランクのレコードがあります。
を使用rank()
すると、同じ給与の2つのレコードが同じランク値で返され、ランク値と次のsalary
値の間にギャップが生じます。したがって、ランク1、1、1、4、4、6を取得する可能性があります。ランク付けされた3つすべての「1」の給与は同じであり、ランク付けされた両方のレコードの「4」の給与は同じです。同じランクが割り当てられたレコード内では、順序は引き続き任意です。
を使用dense_rank()
すると、同じ給与の2つのレコードが同じランク値で返され、「ランク」値と次の値の間にギャップはありませんsalary
。したがって、ランク1、1、1、2、2、3を取得する可能性があります。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()
正確に1つになりますが、同点がある場合、それが実際に3番目に高いかどうかはわかりません。何をしようとしているのかを決める必要があります。