मुझे लगता है कि दो कारणों से रैंक () फ़ंक्शन इसके साथ जाने का तरीका नहीं है।
सबसे पहले, यह संभवतः न्यूनतम ()-आधारित पद्धति से कम कुशल है।
इसका कारण यह है कि क्वेरी को प्रति विभाग सभी वेतनों की एक क्रमबद्ध सूची बनाए रखनी होती है क्योंकि यह डेटा को स्कैन करती है, और बाद में इस सूची को फिर से पढ़कर रैंक दी जाएगी। स्पष्ट रूप से उन अनुक्रमणिकाओं के अभाव में जिनका इसके लिए लाभ उठाया जा सकता है, आप अंतिम डेटा आइटम को पढ़े जाने तक एक रैंक निर्दिष्ट नहीं कर सकते हैं, और सूची का रखरखाव महंगा है।
इसलिए रैंक () फ़ंक्शन का प्रदर्शन स्कैन किए जाने वाले तत्वों की कुल संख्या पर निर्भर है, और यदि संख्या पर्याप्त है कि सॉर्ट डिस्क पर फैल जाता है तो प्रदर्शन गिर जाएगा।
यह शायद अधिक कुशल है:
select dept,
emp,
salary
from
(
SELECT dept,
emp,
salary,
Min(salary) Over (Partition By dept) min_salary
FROM mytable
)
where salary = min_salary
/
इस पद्धति के लिए केवल यह आवश्यक है कि क्वेरी अब तक सामने आए न्यूनतम मूल्य के प्रति विभाग एक एकल मान बनाए रखे। यदि एक नया न्यूनतम सामने आता है तो मौजूदा मान को संशोधित किया जाता है, अन्यथा नया मान छोड़ दिया जाता है। मेमोरी में रखे जाने वाले तत्वों की कुल संख्या विभागों की संख्या से संबंधित है, स्कैन की गई पंक्तियों की संख्या से नहीं।
यह हो सकता है कि Oracle के पास यह पहचानने के लिए एक कोड पथ है कि इस मामले में रैंक की गणना करने की वास्तव में आवश्यकता नहीं है, लेकिन मैं इस पर दांव नहीं लगाऊंगा।
रैंक () को नापसंद करने का दूसरा कारण यह है कि यह सिर्फ गलत प्रश्न का उत्तर देता है। सवाल यह नहीं है कि "किस रिकॉर्ड में वेतन है जो पहली रैंकिंग है जब प्रति विभाग वेतन आरोही क्रम में है", यह "किस रिकॉर्ड में वेतन है जो प्रति विभाग न्यूनतम है"। इससे मुझे बहुत फर्क पड़ता है, कम से कम।