Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में DENSE_RANK () कैसे काम करता है

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      |
+----------+---------+--------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर - sp_spaceused के आंतरिक भाग को विच्छेदित करें

  2. कैसे एसक्यूएल सर्वर में group_concat के साथ एक क्वेरी बनाने के लिए?

  3. SQL सर्वर में डुप्लिकेट पंक्तियाँ हटाएं

  4. एमएस एक्सेस कॉल एसक्यूएल सर्वर संग्रहीत प्रक्रिया

  5. दो डेटाबेस के बीच विदेशी कुंजी संबंध जोड़ें