समस्या:
आप RANK
. द्वारा निर्मित रैंकिंग की तुलना करना चाहते हैं और DENSE_RANK
और उन्हें तालिका में नए कॉलम के रूप में जोड़ें।
उदाहरण:
हमारे डेटाबेस में sales_assistant
निम्नलिखित कॉलम में डेटा के साथ:id
(प्राथमिक कुंजी), first_name
, last_name
, month
, और sold products
।
आईडी | <थ>पहला_नामlast_name | माह | बेचे गए उत्पाद | |
---|---|---|---|---|
1 | लिसा | काला | 5 | 2300 |
2 | मैरी | याकूब | 5 | 2400 |
3 | लिसा | काला | 6 | 2700 |
4 | मैरी | याकूब | 6 | 2700 |
5 | एलेक्स | स्मिथ | 6 | 2900 |
6 | मैरी | याकूब | 7 | 1200 |
7 | लिसा | काला | 7 | 1200 |
8 | एलेक्स | स्मिथ | 7 | 1000 |
आइए प्रत्येक बिक्री सहायक का पहला और अंतिम नाम और बेचे गए उत्पादों की संख्या प्रदर्शित करें। हम उन्हें अवरोही क्रम में बेचे जाने वाले उत्पादों की संख्या के संदर्भ में भी रैंक करना चाहते हैं।
समाधान 1:
चयन रैंक() ओवर (बेचे गए उत्पादों डीईएससी द्वारा ऑर्डर) एएस आर, डेंस_रैंक() ओवर (बेचे गए उत्पादों डीईएससी द्वारा ऑर्डर) एएस डॉ, फर्स्ट_नाम, लास्ट_नाम, महीना, बेचे गए उत्पाद सेल्स_असिस्टेंट;
यह क्वेरी दो रैंकिंग लौटाती है:एक RANK
. द्वारा निर्मित और दूसरा DENSE_RANK
. द्वारा . क्या अंतर है?
सीधे शब्दों में कहें, RANK
समान रैंक संख्या वाले रिकॉर्ड के बाद पदों की संख्या को छोड़ देता है। रैंकिंग RANK_DENSE
1 से 6 तक स्थिति संख्या लौटाता है क्योंकि यह समान रैंक संख्या वाले रिकॉर्ड को नहीं छोड़ता है:
r | डॉ | <थ>पहला_नामlast_name | माह | बेचे गए उत्पाद | |
---|---|---|---|---|---|
1 | 1 | एलेक्स | स्मिथ | 6 | 2900 |
2 | 2 | लिसा | काला | 6 | 2700 |
2 | 2 | मैरी | याकूब | 6 | 2700 |
4 | 3 | मैरी | याकूब | 5 | 2400 |
5 | 4 | लिसा | काला | 5 | 2300 |
6 | 5 | मैरी | याकूब | 7 | 1200 |
6 | 5 | लिसा | काला | 7 | 1200 |
8 | 6 | एलेक्स | स्मिथ | 7 | 1000 |
चर्चा:
यदि आप परिणाम सेट में पंक्तियों को रैंक करना चाहते हैं, तो SQL RANK()
. प्रदान करता है और DENSE_RANK
कार्य। इन कार्यों का उपयोग SELECT
. में किया जाता है अन्य कॉलम के साथ। RANK
के बाद या DENSE_RANK
, हम OVER()
. कहते हैं फ़ंक्शन, जो एक ORDER BY
. लेता है एक रैंकिंग निर्दिष्ट करने से पहले क्रमबद्ध करने के लिए कॉलम के नाम के साथ क्लॉज।
DENSE_RANK
के विपरीत , RANK
समान रैंकिंग के बाद स्थान छोड़ देता है। छोड़े गए पदों की संख्या इस बात पर निर्भर करती है कि कितनी पंक्तियों की रैंकिंग समान थी। उदाहरण के लिए, मैरी और लिसा ने समान संख्या में उत्पाद बेचे और दोनों को #2 स्थान दिया गया। RANK
के साथ , अगला स्थान #4 है; DENSE_RANK
. के साथ , अगला स्थान #3 है।
दोनों RANK
और RANK_DENSE
डेटा के विभाजन पर काम करें:
समाधान 1:
चयन रैंक() ओवर (बेचे गए उत्पादों के अनुसार डीईएससी द्वारा विभाजन) आर, DENSE_RANK () के रूप में (बेचे गए उत्पादों के अनुसार महीने के क्रम में विभाजन) पूर्व>आप दिए गए कॉलम के अनुसार रिकॉर्ड्स को समूहों में विभाजित कर सकते हैं (हमारे उदाहरण में,
month
) इस स्थिति में, रिकॉर्ड को विभाजन के हिस्से के रूप में रैंक किया जाता है:
r | डॉ | <थ>पहला_नामlast_name | माह | बेचे गए उत्पाद | |
---|---|---|---|---|---|
1 | 1 | मैरी | याकूब | 5 | 2400 |
2 | 2 | लिसा | काला | 5 | 2300 |
1 | 1 | एलेक्स | स्मिथ | 6 | 2900 |
2 | 2 | लिसा | काला | 6 | 2700 |
2 | 2 | मैरी | याकूब | 6 | 2700 |
1 | 1 | मैरी | याकूब | 7 | 1200 |
1 | 1 | लिसा | काला | 7 | 1200 |
3 | 2 | एलेक्स | स्मिथ | 7 | 1000 |