0

The following example displays the top three earners’ names and salaries. These employees belong to department 1002 in the EMPLOYEE table:

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

In the above example, the inline view retrieves the first name and salary of employees working in department 1002 in descending order of their salary. The WHERE condition of the outer query specifies that the result set would return only the first three rows.

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(),两个具有相同薪水的记录将以任意顺序返回,具有不同的“排名”,即您将始终拥有排名为 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()将有一个,但如果有关系,您将不知道它是否实际上是第三高的。您需要确定哪些匹配您要执行的操作。

于 2013-01-28T14:30:33.840 回答
1

在内部查询中使用 a rank() over (order by salary),在外部查询中只需选择 rank=3。

于 2013-01-28T14:27:53.983 回答