SQL सर्वर में, DENSE_RANK()
फ़ंक्शन परिणाम सेट के विभाजन के भीतर प्रत्येक पंक्ति की रैंक देता है। एक पंक्ति की रैंक पंक्ति से पहले आने वाली अलग-अलग रैंकों की संख्या से एक प्लस होती है।
यह फ़ंक्शन RANK()
. के समान है , लेकिन रैंकिंग मूल्यों में अंतराल के बिना जो RANK()
. के साथ हो सकता है जब परिणाम सेट में संबंध मौजूद हों।
सिंटैक्स
वाक्य रचना इस प्रकार है:
DENSE_RANK ( ) OVER ( [] < order_by_clause > )
FROM
. द्वारा निर्मित परिणाम सेट को विभाजित करता है विभाजन में खंड जिस पर फ़ंक्शन लागू होता है। यदि निर्दिष्ट नहीं है, तो क्वेरी परिणाम सेट की सभी पंक्तियों को एक समूह के रूप में माना जाता है।
ध्यान दें कि OVER
खंड आम तौर पर एक
उदाहरण 1 - मूल उपयोग
यहां DENSE_RANK()
. के उपयोग को दर्शाने वाला एक बुनियादी उदाहरण दिया गया है समारोह:
SELECT AlbumId, AlbumName, ArtistId, DENSE_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 | 2 | | 19 | All Night Wrong | 3 | 3 | | 20 | The Sixteen Men of Tain | 3 | 3 | | 12 | Big Swing Face | 4 | 4 | | 4 | Ziltoid the Omniscient | 5 | 5 | | 5 | Casualties of Cool | 5 | 5 | | 6 | Epicloud | 5 | 5 | | 3 | Singing Down the Lane | 6 | 6 | | 16 | Long Lost Suitcase | 7 | 7 | | 17 | Praise and Blame | 7 | 7 | | 18 | Along Came Jones | 7 | 7 | | 11 | No Sound Without Silence | 9 | 8 | | 21 | Yo Wassup | 9 | 8 | | 22 | Busted | 9 | 8 | | 13 | Blue Night | 12 | 9 | | 14 | Eternity | 12 | 9 | | 15 | Scandinavia | 12 | 9 | +-----------+--------------------------+------------+--------+
ArtistId को देखें और रैंक स्तंभ। हर बार कलाकार आईडी बढ़ने पर रैंक बढ़ती है। ऐसा इसलिए है क्योंकि मैं ArtistId द्वारा ऑर्डर कर रहा हूं, और इसलिए प्रत्येक नए कलाकार को एक नया रैंक मिलेगा।
रैंक प्रत्येक कलाकार के साथ समान रहती है, भले ही कितनी पंक्तियों में एक ही कलाकार आईडी हो, क्योंकि परिणाम उस कॉलम द्वारा क्रमबद्ध होते हैं। उदाहरण के लिए, पांच पंक्तियों में एक ही कलाकार आईडी है और इसलिए उनमें भी एक ही रैंक है। दूसरे शब्दों में, वे सभी रैंक 1 के लिए बंधे हैं।
कई पंक्तियों में, रैंक आर्टिस्टआईड के समान होता है, लेकिन यह केवल एक संयोग है। ऐसा ही होता है कि ArtistId एक IDENTITY
है कॉलम जो 1 से शुरू होता है और 1 से बढ़ता है, जो कि RANK()
. भी है करता है। हालाँकि, आप देखेंगे कि वे सभी पंक्तियों में समान नहीं हैं। उदाहरण के लिए, आर्टिस्टआईड 7 से 9 तक छोड़ देता है, लेकिन रैंक केवल 7 से 8 तक बढ़ जाती है, और उस बिंदु से, दोनों कॉलम में अलग-अलग मान होते हैं।
उदाहरण 2 - विभाजन
आप परिणामों को विभाजनों में भी विभाजित कर सकते हैं। जब आप ऐसा करते हैं, तो रैंक की गणना प्रत्येक विभाजन के लिए की जाती है (इसलिए यह प्रत्येक नए विभाजन के साथ फिर से शुरू होता है)।
उदाहरण:
SELECT Genre, AlbumName, ArtistId, DENSE_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 | 2 | | Pop | Long Lost Suitcase | 7 | 1 | | Pop | Praise and Blame | 7 | 1 | | Pop | Along Came Jones | 7 | 1 | | Pop | No Sound Without Silence | 9 | 2 | | Pop | Blue Night | 12 | 3 | | Pop | Eternity | 12 | 3 | | Pop | Scandinavia | 12 | 3 | | 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 | 2 | | Rock | Ziltoid the Omniscient | 5 | 3 | | Rock | Casualties of Cool | 5 | 3 | | Rock | Epicloud | 5 | 3 | +---------+--------------------------+------------+--------+
इस मामले में मैं शैली द्वारा विभाजन करता हूं। यह प्रत्येक पंक्ति को केवल उसी विभाजन में अन्य पंक्तियों के विरुद्ध रैंक करने का कारण बनता है। इसलिए प्रत्येक विभाजन रैंकिंग मान को 1 से फिर से शुरू करने का कारण बनता है।
उदाहरण 3 - एक स्कोरबोर्ड उदाहरण
उपयोगकर्ता को रैंक प्रदर्शित करने के लिए यहां एक संभावित उपयोग का मामला है।
SELECT Player, Score, DENSE_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, 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 | +----------+---------+--------+
इस मामले में लिसा और बार्ट नंबर 1 पर बंधे हैं। फिर बर्न्स नंबर 2 पर आते हैं (भले ही वह तीसरे व्यक्ति हों)।
यदि आप पसंद करते हैं कि बर्न्स को इस मामले में नंबर 3 (और 4 पर मेग, और इसी तरह) को स्थान दिया गया था, तो RANK()
का उपयोग करें। इसके बजाय कार्य करें।
उदाहरण 4 - DENSE_RANK() को RANK() से बदलना
यहाँ फिर से वही उदाहरण है, इस समय को छोड़कर मैं RANK()
. का उपयोग करता हूँ :
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 | +----------+---------+--------+