ऐसा करने का तरीका Oracle के विश्लेषणात्मक कार्यों के साथ है। आपका विशेष परिदृश्य मेरे द्वारा किसी अन्य सूत्र में दिए गए समाधान का एक रूप है।
यदि आप केवल दूसरे उच्चतम वेतन का चयन करने में रुचि रखते हैं तो DENSE_RANK(), RANK() और ROW_NUMBER() में से कोई भी काम करेगा:
SQL> select * from
2 ( select sal
3 , rank() over (order by sal desc) as rnk
4 from
5 ( select distinct sal
6 from emp )
7 )
8 where rnk = 2
9 /
SAL RNK
---------- ----------
3000 2
SQL>
हालांकि, यदि आप अतिरिक्त जानकारी का चयन करना चाहते हैं, जैसे कि दूसरे उच्चतम वेतन वाले कर्मचारी का नाम, तो आपके द्वारा चुना गया कार्य परिणाम को प्रभावित करेगा। एक को दूसरे के ऊपर चुनने का मुख्य कारण यह है कि टाई होने पर क्या होता है।
यदि आप ROW_NUMBER() का उपयोग करते हैं तो यह वेतन द्वारा आदेशित दूसरे कर्मचारी को वापस कर देगा:क्या होगा यदि दो कर्मचारी उच्चतम वेतन के लिए बाध्य हैं? क्या होगा यदि दो कर्मचारी दूसरे उच्चतम वेतन के लिए टाई कर रहे हैं? जबकि यदि आप RANK() का उपयोग करते हैं और दो कर्मचारी पहले उच्चतम वेतन के लिए काम कर रहे हैं, तो नहीं होगा रैंक =2 के साथ रिकॉर्ड।
मेरा सुझाव है कि इन मामलों में चुनने के लिए DENSE_RANK() आमतौर पर सबसे सुरक्षित कार्य है, लेकिन यह वास्तव में विशिष्ट व्यावसायिक आवश्यकता पर निर्भर करता है।