बढ़ते हुए पूर्णांक मान को पुनः प्राप्त करने के लिए RANK, DENSE_RANK और ROW_NUMBER फ़ंक्शन का उपयोग किया जाता है। वे ORDER BY क्लॉज द्वारा लगाई गई शर्त के आधार पर एक मूल्य से शुरू होते हैं। इन सभी कार्यों को ठीक से काम करने के लिए ORDER BY क्लॉज की आवश्यकता होती है। विभाजित डेटा के मामले में, प्रत्येक विभाजन के लिए पूर्णांक काउंटर को 1 पर रीसेट किया जाता है।
इस लेख में, हम RANK, DENSE_RANK और ROW_NUMBER फ़ंक्शंस का विस्तार से अध्ययन करेंगे, लेकिन इससे पहले, आइए डमी डेटा बनाते हैं कि इन फ़ंक्शंस का उपयोग तब तक किया जा सकता है जब तक कि आपका डेटाबेस पूरी तरह से बैकअप न हो।
डमी डेटा तैयार करना
शोरूम नामक डेटाबेस बनाने के लिए निम्न स्क्रिप्ट निष्पादित करें और कार नामक एक तालिका शामिल करें (जिसमें कारों के 15 यादृच्छिक रिकॉर्ड शामिल हैं):
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) USE ShowRoom INSERT INTO Cars VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 1500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200), (11, 'Atlas', 'Volkswagen', 5000), (12, '110', 'Bugatti', 8000), (13, 'Landcruiser', 'Toyota', 3000), (14, 'Civic', 'Honda', 1800), (15, 'Accord', 'Honda', 2000)
रैंक फ़ंक्शन
ORDER BY क्लॉज की स्थिति के आधार पर रैंक की गई पंक्तियों को पुनः प्राप्त करने के लिए RANK फ़ंक्शन का उपयोग किया जाता है। उदाहरण के लिए, यदि आप तीसरी उच्चतम शक्ति वाली कार का नाम खोजना चाहते हैं, तो आप रैंक फ़ंक्शन का उपयोग कर सकते हैं।
SELECT name,company, power, RANK() OVER(ORDER BY power DESC) AS PowerRank FROM Cars
ऊपर दी गई स्क्रिप्ट कार्स टेबल में सभी रिकॉर्ड्स को ढूंढती है और रैंक करती है और उन्हें अवरोही शक्ति के क्रम में ऑर्डर करती है। आउटपुट इस तरह दिखता है:
उपरोक्त तालिका में पावररैंक कॉलम में कारों के रैंक को उनकी शक्ति के अवरोही क्रम द्वारा क्रमबद्ध किया गया है। RANK फ़ंक्शन के बारे में एक दिलचस्प बात यह है कि यदि ORDER BY कॉलम में मान के लिए N पिछले रिकॉर्ड के बीच एक टाई है, तो RANK फ़ंक्शन काउंटर को बढ़ाने से पहले अगले N-1 पदों को छोड़ देता है। उदाहरण के लिए, उपरोक्त परिणाम में, पहली और दूसरी पंक्तियों के बीच पावर कॉलम में मानों के लिए एक टाई है, इसलिए रैंक फ़ंक्शन अगले (2-1 =1) एक रिकॉर्ड को छोड़ देता है और सीधे तीसरी पंक्ति में कूद जाता है।
रैंक फ़ंक्शन का उपयोग पार्टिशन बाय क्लॉज के संयोजन में किया जा सकता है। उस स्थिति में, प्रत्येक नए विभाजन के लिए रैंक को रीसेट किया जाएगा। निम्नलिखित स्क्रिप्ट पर एक नज़र डालें:
SELECT name,company, power, RANK() OVER(PARTITION BY company ORDER BY power DESC) AS PowerRank FROM Cars
उपरोक्त लिपि में, हम परिणामों को कंपनी कॉलम द्वारा विभाजित करते हैं। अब प्रत्येक कंपनी के लिए, रैंक को नीचे दिखाए अनुसार 1 पर रीसेट किया जाएगा:
DENSE_RANK फंक्शन
DENSE_RANK फ़ंक्शन RANK फ़ंक्शन के समान है, हालांकि DENSE_RANK फ़ंक्शन किसी भी रैंक को नहीं छोड़ता है यदि पिछले रिकॉर्ड के रैंक के बीच एक टाई है। निम्नलिखित स्क्रिप्ट पर एक नज़र डालें।
SELECT name,company, power, RANK() OVER(PARTITION BY company ORDER BY power DESC) AS PowerRank FROM Cars
आप आउटपुट से देख सकते हैं कि पहली दो पंक्तियों के रैंकों के बीच एक टाई होने के बावजूद, अगली रैंक को नहीं छोड़ा गया है और 3 के बजाय 2 का मान दिया गया है। रैंक फ़ंक्शन के साथ, खंड द्वारा विभाजन कर सकते हैं DENSE_RANK फ़ंक्शन के साथ भी उपयोग किया जा सकता है जैसा कि नीचे दिखाया गया है:
SELECT name,company, power, DENSE_RANK() OVER(PARTITION BY company ORDER BY power DESC) AS DensePowerRank FROM Cars
ROW_NUMBER फ़ंक्शन
RANK और DENSE_RANK फ़ंक्शंस के विपरीत, ROW_NUMBER फ़ंक्शन केवल 1 से शुरू होने वाले सॉर्ट किए गए रिकॉर्ड की पंक्ति संख्या देता है। उदाहरण के लिए, यदि ORDER BY कॉलम में पहले दो रिकॉर्ड के RANK और DENSE_RANK फ़ंक्शन समान हैं, तो दोनों को 1 असाइन किया गया है। उनके रैंक और DENSE_RANK के रूप में। हालांकि, ROW_NUMBER फ़ंक्शन उन पंक्तियों को मान 1 और 2 असाइन करेगा, इस तथ्य को ध्यान में रखे बिना कि वे समान रूप से खाते में हैं। ROW_NUMBER फ़ंक्शन को क्रिया में देखने के लिए निम्न स्क्रिप्ट निष्पादित करें।
SELECT name,company, power, ROW_NUMBER() OVER(ORDER BY power DESC) AS RowRank FROM Cars
आउटपुट से, आप देख सकते हैं कि ROW_NUMBER फ़ंक्शन प्रत्येक रिकॉर्ड के लिए एक नई पंक्ति संख्या निर्दिष्ट करता है, चाहे उसका मूल्य कुछ भी हो।
SELECT name, company, power, ROW_NUMBER() OVER(PARTITION BY company ORDER BY power DESC) AS RowRank FROM Cars
आउटपुट इस तरह दिखता है:
रैंक, DENSE_RANK, और ROW_NUMBER फ़ंक्शन के बीच समानताएं
RANK, DENSE_RANK और ROW_NUMBER फ़ंक्शंस में निम्नलिखित समानताएँ हैं:
1- उन सभी को क्लॉज़ द्वारा ऑर्डर की आवश्यकता होती है।
2- ये सभी 1 के आधार मान के साथ बढ़ते हुए पूर्णांक को लौटाते हैं।
3- जब पार्टिशन बाय क्लॉज के साथ संयुक्त किया जाता है, तो ये सभी फ़ंक्शन दिए गए पूर्णांक मान को 1 पर रीसेट कर देते हैं जैसा कि हमने देखा है।
4- यदि ORDER BY क्लॉज द्वारा उपयोग किए गए कॉलम में कोई डुप्लिकेट मान नहीं हैं, तो ये फ़ंक्शन समान आउटपुट लौटाते हैं।
आखिरी बिंदु को स्पष्ट करने के लिए, आइए शोरूम डेटाबेस में एक नई तालिका Car1 बनाएं जिसमें पावर कॉलम में कोई डुप्लिकेट मान न हो। निम्न स्क्रिप्ट निष्पादित करें:
USE ShowRoom; CREATE TABLE Cars1 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 2500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 4000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200) The cars1 table has no duplicate values. Now let’s execute the RANK, DENSE_RANK and ROW_NUMBER functions on the Cars1 table ORDER BY power column. Execute the following script: SELECT name,company, power, RANK() OVER(ORDER BY power DESC) AS [Rank], DENSE_RANK() OVER(ORDER BY power DESC) AS [Dense Rank], ROW_NUMBER() OVER(ORDER BY power DESC) AS [Row Number] FROM Cars1
आउटपुट इस तरह दिखता है:
आप देख सकते हैं कि पावर कॉलम में कोई डुप्लिकेट मान नहीं हैं जिसका उपयोग ORDER BY क्लॉज में किया जा रहा है, इसलिए RANK, DENSE_RANK, और ROW_NUMBER फ़ंक्शंस का आउटपुट समान है।
रैंक, DENSE_RANK और ROW_NUMBER फ़ंक्शंस के बीच अंतर
RANK, DENSE_RANK और ROW_NUMBER फ़ंक्शन के बीच एकमात्र अंतर यह है कि ORDER BY क्लॉज में उपयोग किए जा रहे कॉलम में डुप्लिकेट मान हैं।
यदि आप शोरूम डेटाबेस में कारों की तालिका में वापस जाते हैं, तो आप देख सकते हैं कि इसमें बहुत सारे हैं डुप्लिकेट मान। आइए शक्ति द्वारा क्रमित Cars1 तालिका के RANK, DENSE_RANK, और ROW_NUMBER को खोजने का प्रयास करें। निम्न स्क्रिप्ट निष्पादित करें:
नाम, कंपनी, शक्ति चुनें,
RANK() OVER(ORDER BY power DESC) AS [Rank], DENSE_RANK() OVER(ORDER BY power DESC) AS [Dense Rank], ROW_NUMBER() OVER(ORDER BY power DESC) AS [Row Number] FROM Cars
आउटपुट इस तरह दिखता है:
आउटपुट से, आप देख सकते हैं कि RANK फ़ंक्शन अगले N-1 रैंक को छोड़ देता है यदि N पिछली रैंकों के बीच एक टाई है। दूसरी ओर, रैंकों के बीच टाई होने पर DENSE_RANK फ़ंक्शन रैंक को नहीं छोड़ता है। अंत में, ROW_NUMBER फ़ंक्शन का रैंकिंग से कोई सरोकार नहीं है। यह केवल सॉर्ट किए गए रिकॉर्ड की पंक्ति संख्या देता है। भले ही ORDER BY क्लॉज में उपयोग किए गए कॉलम में डुप्लिकेट रिकॉर्ड हों, ROW_NUMBER फ़ंक्शन डुप्लिकेट मान नहीं लौटाएगा। इसके बजाय, डुप्लिकेट मानों की परवाह किए बिना यह बढ़ता रहेगा।
उपयोगी लिंक:
ROW_NUMBER(), RANK() और DENSE_RANK() फ़ंक्शंस के बारे में अधिक जानने के लिए, अहमद यासीन का शानदार लेख पढ़ें:
SQL सर्वर में पंक्तियों को रैंक करने के तरीके:ROW_NUMBER(), RANK(), DENSE_RANK() और NTILE()