Oracle SQL - 如何检索列的最高5个值

Tre*_*vor 16 sql oracle top-n

如何编写一个查询,其中只返回具有最高或最低列值的选定行数.

即5名受薪员工的报告?

APC*_*APC 25

最好的方法是使用分析函数,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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

还有一个使用ROWNUM伪列的非分析解决方案.这很笨重,因为在ORDER BY子句之前应用了ROWNUM,这可能导致意外结果.很少有任何理由使用ROWNUM而不是ROW_NUMBER()或其中一个排名函数.


roa*_*242 11

试试这个:

SELECT * FROM 
    (SELECT field1, field2 FROM fields order by field1 desc) 
where rownum <= 5
Run Code Online (Sandbox Code Playgroud)

另请查看此资源,以获取有关rownum如何工作的更详细说明.