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 BY
和ORDER BY
子句正确地调整返回的ROW_NUMBER
/ RANK
/ DENSE_RANK
值。
在9i之前,唯一的select是和ROWNUM
一起工作 – 这比使用ROW_NUMBER
( 链接 )要快。