3 回答
TA贡献1817条经验 获得超6个赞
最好的方法是使用分析函数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()或排名函数之一。
TA贡献1775条经验 获得超8个赞
试试这个:
SELECT * FROM
(SELECT field1, field2 FROM fields order by field1 desc)
where rownum <= 5
还请查看该资源,以获取有关rownum工作原理的更详细描述。
TA贡献1772条经验 获得超5个赞
在Oracle 12c中,可以使用FETCH..FIRST ROWS..ONLY
获取前5名最高薪水。
SELECT *
FROM EMPLOYEES
ORDER BY SALARY DESC
FETCH FIRST 5 ROWS ONLY;
添加回答
举报