0

次の例は、上位3人の稼ぎ手の名前と給与を示しています。これらの従業員は、EMPLOYEEテーブルの部門1002に属しています。

SELECT ROWNUM, fname, salary
FROM (SELECT fname, salary
FROM employee
WHERE dept_id=1002
ORDER BY salary DESC)
WHERE ROWNUM <=3;

上記の例では、インラインビューは、部門1002で働く従業員の名と給与を給与の降順で取得します。外部クエリのWHERE条件は、結果セットが最初の3行のみを返すことを指定します。

4

2 に答える 2

3

これは前の質問とほとんど同じです、または少なくとも答えはあなたがそのために得たものと似ています:

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番目に高いかどうかはわかりません。何をしようとしているのかを決める必要があります。

于 2013-01-28T14:30:33.840 に答える
1

内側のクエリでaを使用rank() over (order by salary)し、外側のクエリでランク=3を選択します。

于 2013-01-28T14:27:53.983 に答える