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如何工作的更详细说明.
| 归档时间: |
|
| 查看次数: |
48154 次 |
| 最近记录: |