ऐसा करने का सबसे अच्छा तरीका विश्लेषणात्मक कार्यों के साथ है, 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() विश्लेषणात्मक फ़ंक्शन भी है जिसका उपयोग हम पंक्तियों की सटीक संख्या वापस करने के लिए कर सकते हैं। हालाँकि, हमें पंक्ति संख्या के आधार पर समाधानों का उपयोग करने से बचना चाहिए, जब तक कि व्यापार तर्क एक टाई की स्थिति में सेट किए गए परिणाम को मनमाने ढंग से काटकर खुश न हो। पांच उच्चतम मान for मांगने में अंतर है और पहले पांच रिकॉर्ड उच्च मानों के आधार पर क्रमित किए गए
ROWNUM छद्म-स्तंभ का उपयोग करते हुए एक गैर-विश्लेषणात्मक समाधान भी है। यह क्लूनी है क्योंकि ROWNUM को ORDER BY क्लॉज से पहले लागू किया जाता है, जिससे अप्रत्याशित परिणाम हो सकते हैं। ROW_NUMBER() या किसी रैंकिंग फ़ंक्शन के बजाय ROWNUM का उपयोग करने का शायद ही कोई कारण हो।