SQL सर्वर में, RANK()
फ़ंक्शन परिणाम सेट के विभाजन के भीतर प्रत्येक पंक्ति की रैंक देता है। एक पंक्ति की रैंक पंक्ति से पहले आने वाली रैंकों की संख्या से एक प्लस होती है।
सिंटैक्स
वाक्य रचना इस प्रकार है:
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
partition_by_clause वैकल्पिक है। यह FROM
. द्वारा निर्मित परिणाम सेट को विभाजित करता है विभाजन में खंड जिस पर फ़ंक्शन लागू होता है। यदि निर्दिष्ट नहीं है, तो फ़ंक्शन क्वेरी परिणाम सेट की सभी पंक्तियों को एक समूह के रूप में मानता है।
order_by_clause आवश्यक है। यह फ़ंक्शन लागू होने से पहले डेटा का क्रम निर्धारित करता है।
ध्यान दें कि OVER
क्लॉज आम तौर पर एक rows_or_range_clause . को स्वीकार करता है , लेकिन उस तर्क का उपयोग RANK()
. के साथ नहीं किया जा सकता है समारोह।
उदाहरण 1 - मूल उपयोग
RANK()
. के उपयोग को दर्शाने वाला एक बुनियादी उदाहरण यहां दिया गया है समारोह:
SELECT AlbumId, AlbumName, ArtistId, RANK() OVER (ORDER BY ArtistId ASC) 'Rank' FROM Albums;
परिणाम:
+-----------+--------------------------+------------+--------+ | AlbumId | AlbumName | ArtistId | Rank | |-----------+--------------------------+------------+--------| | 1 | Powerslave | 1 | 1 | | 7 | Somewhere in Time | 1 | 1 | | 8 | Piece of Mind | 1 | 1 | | 9 | Killers | 1 | 1 | | 10 | No Prayer for the Dying | 1 | 1 | | 2 | Powerage | 2 | 6 | | 19 | All Night Wrong | 3 | 7 | | 20 | The Sixteen Men of Tain | 3 | 7 | | 12 | Big Swing Face | 4 | 9 | | 4 | Ziltoid the Omniscient | 5 | 10 | | 5 | Casualties of Cool | 5 | 10 | | 6 | Epicloud | 5 | 10 | | 3 | Singing Down the Lane | 6 | 13 | | 16 | Long Lost Suitcase | 7 | 14 | | 17 | Praise and Blame | 7 | 14 | | 18 | Along Came Jones | 7 | 14 | | 11 | No Sound Without Silence | 9 | 17 | | 21 | Yo Wassup | 9 | 17 | | 22 | Busted | 9 | 17 | | 13 | Blue Night | 12 | 20 | | 14 | Eternity | 12 | 20 | | 15 | Scandinavia | 12 | 20 | +-----------+--------------------------+------------+--------+
हमारा मुख्य फोकस ArtistId . है और रैंक स्तंभ। हम देख सकते हैं कि जब भी कलाकार आईडी बढ़ता है तो रैंक बढ़ता है। ऐसा इसलिए है क्योंकि मैं ArtistId द्वारा आदेश दे रहा हूं, और इसलिए प्रत्येक नए कलाकार को एक नई रैंक मिलेगी।
जब हम रैंक . को देखते हैं कॉलम, हम काफी कुछ संबंध देख सकते हैं। यानी काफी कुछ पंक्तियाँ समान रैंक साझा करती हैं। यह अपेक्षित है, क्योंकि मैं ArtistId द्वारा आदेश दे रहा हूं और कुछ ArtistId मान एक से अधिक पंक्तियों में हैं।
ये बंधी हुई पंक्तियाँ यह प्रदर्शित करने के लिए बहुत अच्छी हैं कि कैसे RANK()
काम करता है। जैसा कि उल्लेख किया गया है, यह एक से अधिक रैंकों की संख्या में वृद्धि करता है जो इससे पहले आए थे। बंधी हुई पंक्तियों के कारण रैंकिंग मानों में अंतराल दिखाई देता है (अर्थात वे हमेशा 1 से वृद्धि नहीं करते हैं)। उपरोक्त उदाहरण में, काफी कुछ अंतराल हैं। पहला वह है जहां यह 1 से 6 तक जाता है। फिर दूसरा जब यह 7 से 9 तक जाता है, और इसी तरह।
यदि आप इन अंतरालों को नहीं चाहते हैं, तो DENSE_RANK()
. का उपयोग करें , जो बिना अंतराल को छोड़कर उसी तरह काम करता है। सघन रैंक की गणना एक प्लस विशिष्ट . की संख्या के रूप में की जाती है रैंक मान जो उस पंक्ति से पहले आते हैं।
उदाहरण 2 - विभाजन
आप परिणामों को विभाजनों में भी विभाजित कर सकते हैं। जब आप ऐसा करते हैं, तो रैंक की गणना प्रत्येक विभाजन के लिए की जाती है (इसलिए यह प्रत्येक नए विभाजन के साथ फिर से शुरू होता है)।
उदाहरण:
SELECT Genre, AlbumName, ArtistId, RANK() OVER (PARTITION BY Genre ORDER BY ArtistId ASC) 'Rank' FROM Albums INNER JOIN Genres ON Albums.GenreId = Genres.GenreId;
परिणाम:
+---------+--------------------------+------------+--------+ | Genre | AlbumName | ArtistId | Rank | |---------+--------------------------+------------+--------| | Country | Singing Down the Lane | 6 | 1 | | Country | Yo Wassup | 9 | 2 | | Country | Busted | 9 | 2 | | Jazz | All Night Wrong | 3 | 1 | | Jazz | The Sixteen Men of Tain | 3 | 1 | | Jazz | Big Swing Face | 4 | 3 | | Pop | Long Lost Suitcase | 7 | 1 | | Pop | Praise and Blame | 7 | 1 | | Pop | Along Came Jones | 7 | 1 | | Pop | No Sound Without Silence | 9 | 4 | | Pop | Blue Night | 12 | 5 | | Pop | Eternity | 12 | 5 | | Pop | Scandinavia | 12 | 5 | | Rock | Powerslave | 1 | 1 | | Rock | Somewhere in Time | 1 | 1 | | Rock | Piece of Mind | 1 | 1 | | Rock | Killers | 1 | 1 | | Rock | No Prayer for the Dying | 1 | 1 | | Rock | Powerage | 2 | 6 | | Rock | Ziltoid the Omniscient | 5 | 7 | | Rock | Casualties of Cool | 5 | 7 | | Rock | Epicloud | 5 | 7 | +---------+--------------------------+------------+--------+
इस मामले में मैं शैली द्वारा विभाजन करता हूं। यह प्रत्येक पंक्ति को केवल उसी विभाजन में अन्य पंक्तियों के विरुद्ध रैंक करने का कारण बनता है। इसलिए प्रत्येक विभाजन रैंकिंग मान को फिर से 1 से शुरू करने का कारण बनता है।
उदाहरण 3 - एक स्कोरबोर्ड उदाहरण
उपयोगकर्ता को रैंक प्रदर्शित करने के लिए यहां एक संभावित उपयोग का मामला है।
SELECT Player, Score, RANK() OVER (ORDER BY Score Desc) 'Rank' FROM Scoreboard;
परिणाम:
+----------+---------+--------+ | Player | Score | Rank | |----------+---------+--------| | Bart | 2010 | 1 | | Burns | 1270 | 2 | | Meg | 1030 | 3 | | Marge | 990 | 4 | | Lisa | 710 | 5 | | Ned | 666 | 6 | | Apu | 350 | 7 | | Homer | 1 | 8 | +----------+---------+--------+
हालांकि, ध्यान रखें कि किसी भी बंधे हुए परिणाम के परिणामस्वरूप रैंकिंग मूल्यों में अंतर होगा।
अगर लिसा अचानक बार्ट के स्कोर से मेल खाती है तो क्या होगा:
SELECT Player, Score, RANK() OVER (ORDER BY Score Desc) 'Rank' FROM Scoreboard;
परिणाम:
+----------+---------+--------+ | Player | Score | Rank | |----------+---------+--------| | Lisa | 2010 | 1 | | Bart | 2010 | 1 | | Burns | 1270 | 3 | | Meg | 1030 | 4 | | Marge | 990 | 5 | | Ned | 666 | 6 | | Apu | 350 | 7 | | Homer | 1 | 8 | +----------+---------+--------+
इस मामले में नंबर 2 पर कोई भी रैंक नहीं है, क्योंकि पहले दो खिलाड़ी रैंक 1 पर बंधे हैं।
जैसा कि उल्लेख किया गया है, यदि आपको इस तरह के अंतराल को खत्म करने की आवश्यकता है, तो DENSE_RANK()
का उपयोग करें .
उदाहरण 4 - RANK() को DENSE_RANK()
से बदलना
यहाँ फिर से वही उदाहरण है, इस समय को छोड़कर मैं DENSE_RANK()
. का उपयोग करता हूँ :
SELECT Player, Score, DENSE_RANK() OVER (ORDER BY Score Desc) 'Rank' FROM Scoreboard;
परिणाम:
+----------+---------+--------+ | Player | Score | Rank | |----------+---------+--------| | Lisa | 2010 | 1 | | Bart | 2010 | 1 | | Burns | 1270 | 2 | | Meg | 1030 | 3 | | Marge | 990 | 4 | | Ned | 666 | 5 | | Apu | 350 | 6 | | Homer | 1 | 7 | +----------+---------+--------+