具有所有字段的特定行号

时间:2018-12-13 08:17:28

标签: sql oracle oracle11g greatest-n-per-group

我有HR oracle模式,在此,我想显示工资最高的员工的所有字段。

这是我到目前为止所写的内容,但未返回任何内容。

select * from (
      select * from HR.EMPLOYEES 
       order by HR.EMPLOYEES.SALARY DESC) 
 where rownum=3

我想获得此结果而无需使用诸如density_rank()等任何函数。希望保持查询简单。但是,如果有人可以使用解析函数并可以解释其工作原理,那么到目前为止,我仍然可以理解其用法,但我不理解诸如density_rank()之类的函数的用法。对查询中缺少的内容有任何了解吗?

2 个答案:

答案 0 :(得分:2)

rownum = 3将不起作用,因为rownum已应用于生成的结果集。结果集中的第一行始终具有rownum = 1。没有任何结果集可以匹配rownum = 3,因此您不会返回任何行。

执行此操作的方法是使用rank()dense_rank()row_number()之类的分析功能。

select * from 
    ( select emp.*
             , dense_rank() over (order by salary desc) rn
      from hr.employees emp
    )
where rn = 3

是否使用rank()dense_rank()row_number()取决于您处理领带的方式。

如果您使用row_number(),则将获得表中的第三行,按薪水降序排列。如果您有两个雇员的薪水最高,这是正确的吗?或实际上有四位这样的幸运员工)?

如果您使用rank(),则子查询将在有平局的情况下返回排名中的差距,例如1st,2nd =,2nd =,4th,所以您不会获得任何第三名的结果。

另一方面,dense_rank()之间没有任何纽带,例如: 1st,2nd =,2nd =,3rd。这就是为什么我在上面使用它。


对于记录,使用rownum的等效查询将需要一个附加的嵌套子查询。

select * from (
    select emp.*
           , rownum as rn
    from 
        ( select * from hr.employees
          order by salary desc) emp
    )
where rn = 3

这与row_number()解析解决方案具有相同的结果,即它忽略联系。

答案 1 :(得分:0)

对于您的情况,您需要在没有 order by 子句的子查询中确定rownum

select * from
(
select rownum as rn, ee.* 
  from (
        select e.* from employees e order by salary desc
       ) ee
 )      
where rn=3;

P.S。如APC所言,使用分析功能会更好