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;
添加回答
舉報