【问题标题】:Oracle SQL - How to Retrieve highest 5 values of a column [duplicate]Oracle SQL - 如何检索列的最高 5 个值 [重复]
【发布时间】:2011-01-19 09:20:02
【问题描述】:

如何编写一个查询,其中只返回选定数量的行以及最高或最低列值。

即一份收入最高的 5 名员工的报告?

【问题讨论】:

    标签: sql oracle top-n


    【解决方案1】:

    最好的方法是使用分析函数 RANK() 或 DENSE_RANK() ...

    SQL> select * from (
      2        select empno
      3               , sal
      4               , rank() over (order by sal desc) as rnk
      5        from emp)
      6  where rnk <= 5
      7  /
    
         EMPNO        SAL        RNK
    ---------- ---------- ----------
          7839       5000          1
          7788       3000          2
          7902       3000          2
          7566       2975          4
          8083       2850          5
          7698       2850          5
    
    6 rows selected.
    
    SQL>
    

    DENSE_RANK() 在出现平局时压缩间隙:

    SQL> select * from (
      2        select empno
      3               , sal
      4               , dense_rank() over (order by sal desc) as rnk
      5        from emp)
      6  where rnk <= 5
      7  /
    
         EMPNO        SAL        RNK
    ---------- ---------- ----------
          7839       5000          1
          7788       3000          2
          7902       3000          2
          7566       2975          3
          8083       2850          4
          7698       2850          4
          8070       2500          5
    
    7 rows selected.
    
    SQL>
    

    您喜欢哪种行为取决于您的业务需求。

    还有 ROW_NUMBER() 分析函数,我们可以使用它来返回精确的行数。但是,我们应该避免使用基于行号的解决方案,除非业务逻辑乐于在出现平局时任意截断结果集。要求五个最高值按最高值排序的前五个记录

    之间是有区别的

    还有一个使用 ROWNUM 伪列的非解析解。这很笨拙,因为在 ORDER BY 子句之前应用了 ROWNUM,这可能导致意外结果。几乎没有任何理由使用 ROWNUM 代替 ROW_NUMBER() 或排名函数之一。

    【讨论】:

    • 您可以使用QUALIFY ... &lt;= 5 而不是将其包装在另一个选择中。
    • @lins314159 - QUALIFY 不是 Oracle 支持的构造。
    • 我想是的。或者链接是否在谈论其他 Oracle 产品?http://download.oracle.com/docs/cd/E12032_01/doc/epm.921/html_ir_studio/ir_studio-15-36.html
    • 那是“Hyperion System 9 BI+ Interactive Reporting Interactive Reporting Studio”,看起来它支持的不仅仅是Oracle标准SQL。
    【解决方案2】:

    试试这个:

    SELECT * FROM 
        (SELECT field1, field2 FROM fields order by field1 desc) 
    where rownum <= 5
    

    还可以查看this resource,了解有关 rownum 工作原理的更详细说明。

    【讨论】:

      【解决方案3】:

      Oracle 9i+ 提供分析功能:

      所有都需要使用OVER 子句,它允许PARTITION BYORDER BY 子句正确调整返回的ROW_NUMBER/RANK/DENSE_RANK 值。

      在 9i 之前,唯一的选择是使用 ROWNUM - 顺便说一下,这比使用 ROW_NUMBER (link) 更快。

      【讨论】:

      • 谢谢。 OVER 子句对我来说是新的。 +1
      • 实际上 Oracle 在 8i 中引入了分析功能,但仅限于企业版许可。在 9i 中,它们属于标准版许可。
      【解决方案4】:

      Oracle 12c 中,这可以使用FETCH..FIRST ROWS..ONLY 来实现

      获取前 5 名最高薪水。

       SELECT *
             FROM EMPLOYEES
         ORDER BY SALARY DESC
      FETCH FIRST 5 ROWS ONLY;
      

      【讨论】:

        【解决方案5】:
        Select emp_id , salary from employees
          Order by salary desc
          Limit 5;
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        • 1970-01-01
        • 2011-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-11
        相关资源
        最近更新 更多