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

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

即有5名最高工资雇员的报告?

最好的办法是使用分析函数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()分析函数,我们可以使用它来返回精确的行数。 但是,我们应该避免使用基于行号的解决scheme,除非业务逻辑高兴地在任何情况下任意截断结果集。 要求五个最高值以高值sorting前五个logging之间是有区别的

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

试试这个:

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

另外请看这个资源 ,以获得关于rownum如何工作的更详细的描述。

Oracle 9i +提供分析function:

  • ROW_NUMBER
  • DENSE_RANK

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

在9i之前,唯一的select是和ROWNUM一起工作 – 这比使用ROW_NUMBER ( 链接 )要快。