RANK और DENSE_RANK का सुझाव पहले ही दिया जा चुका है - आपकी आवश्यकताओं के आधार पर, आप ROW_NUMBER() पर भी विचार कर सकते हैं:
select * from (
select e.*, row_number() over (order by sal desc) rn from emp e
)
where rn = 2;
RANK(), DENSE_RANK() और ROW_NUMBER() के बीच का अंतर निम्न तक होता है:
- ROW_NUMBER() हमेशा एक अद्वितीय रैंकिंग उत्पन्न करता है; यदि ORDER BY खंड दो पंक्तियों के बीच अंतर नहीं कर सकता है, तब भी यह उन्हें अलग-अलग रैंकिंग (बेतरतीब ढंग से) देगा
- RANK() और DENSE_RANK() उन पंक्तियों को समान रैंकिंग देंगे जिन्हें ORDER BY क्लॉज द्वारा अलग नहीं किया जा सकता है
- DENSE_RANK() हमेशा रैंकों का एक सन्निहित अनुक्रम उत्पन्न करेगा (1,2,3,...), जबकि RANK() समान रैंक वाली दो या अधिक पंक्तियों के बाद अंतराल छोड़ देगा (सोचें "ओलंपिक खेल":यदि दो एथलीटों ने जीता स्वर्ण पदक, कोई दूसरा स्थान नहीं, केवल तीसरा)
इसलिए, यदि आप केवल एक कर्मचारी चाहते हैं (भले ही दूसरे उच्चतम वेतन वाले कई कर्मचारी हों), तो मैं ROW_NUMBER() की अनुशंसा करता हूं।