ROW_NUMBER SQL फ़ंक्शन: पंक्तियों की क्रम संख्या कैसे दिखाएँ
ROW_NUMBER() SQL फ़ंक्शन किसी परिणाम सेट की पंक्तियों को क्रमवार पूर्णांक देता है, वैकल्पिक रूप से डेटा को विभाजित करता है और प्रत्येक विभाजन के भीतर पंक्तियों का क्रम तय करता है।
SQL में, अक्सर डेटासेट असंगठित होते हैं, जिससे विश्लेषण चुनौतीपूर्ण हो सकता है। यह समझने के लिए कि किसी डेटासेट में पंक्तियाँ एक-दूसरे से कैसे संबंधित हैं, हम ROW_NUMBER() फ़ंक्शन का उपयोग कर सकते हैं।
यह फ़ंक्शन परिणाम सेट की पंक्तियों को क्रमवार संख्याएँ देता है, जिससे आगे के संशोधन और विश्लेषण के लिए स्पष्ट क्रम मिल जाता है। यह पूरे डेटासेट के लिए या डेटासेट के भीतर अलग-अलग समूहों के लिए किया जा सकता है।
यह लेख SQL की मूल बातें पहले से जानने की धारणा पर आधारित है। हम प्रचलित ROW_NUMBER() फ़ंक्शन की मूल बातें कवर करेंगे और बढ़ती जटिलता के उदाहरण देंगे।
ROW_NUMBER() Syntax
यहाँ ROW_NUMBER() फ़ंक्शन का मूल सिंटैक्स दिया गया है:
ROW_NUMBER()OVER([PARTITIONBYvalue expression,...][ORDERBY order_by_clause])संचालित द्वारा
आइए मुख्य घटकों को समझते हैं:
ROW_NUMBER(): यही स्वयं फ़ंक्शन है, जो क्रमवार पंक्ति संख्याएँ जनरेट करता है।
OVER (...): यह क्लॉज़ विंडो फ़ंक्शंस जैसे ROW_NUMBER() के लिए अनिवार्य है। यह वह संदर्भ परिभाषित करता है जिसमें पंक्ति संख्याएँ गणना की जाती हैं।
PARTITION BY value_expression: यह वैकल्पिक क्लॉज़ निर्दिष्ट कॉलम(स्) या अभिव्यक्ति(ओं) के आधार पर परिणाम सेट को विभाजनों में बाँटता है। इसके बाद पंक्ति संख्याएँ प्रत्येक विभाजन के भीतर स्वतंत्र रूप से गणना की जाती हैं।
ORDER BY order_by_clause: यह वैकल्पिक क्लॉज़ उस क्रम को निर्दिष्ट करता है जिसमें प्रत्येक विभाजन के भीतर (या यदि PARTITION BY नहीं है तो पूरे परिणाम सेट में) पंक्ति संख्याएँ आवंटित की जाती हैं।
उदाहरण के लिए, व्यापक SQL क्वेरी में हम ROW_NUMBER() का उपयोग इस प्रकार कर सकते हैं:
SELECT Val_1,
ROW_NUMBER()OVER(PARTITIONBY group_1,ORDERBY number DESC)AS rn
FROMData;संचालित द्वारा
ROW_NUMBER() Examples
निम्नलिखित तीन उदाहरणों में, हम मुफ़्त DataLab IDE का उपयोग करेंगे। हम Employees सैंपल डेटासेट (जो पहले से DataLab में उपलब्ध है) का उपयोग करेंगे, जिसमें ये चार कॉलम हैं:
first_name: स्ट्रिंग फ़ील्ड
last_name: स्ट्रिंग फ़ील्ड
gender: स्ट्रिंग फ़ील्ड जिसमें दो मान होते हैं (“M” या “F”)
hire_date: वह तारीख जब कर्मचारी को नियुक्त किया गया
हम निम्न SQL कोड का उपयोग करके डेटासेट को क्वेरी कर सकते हैं:
SELECT e.first_name, e.last_name, e.gender, e.hire_date
FROM employees.employees e
LIMIT100;-- Optionally reduce the size of the outputसंचालित द्वारा
कर्मचारियों को वर्णानुक्रम में क्रमांकित करना
ROW_NUMBER() का उपयोग करने से पहले, लक्ष्य तय करना महत्वपूर्ण है—इससे यह स्पष्ट होगा कि हमें विभाजन और क्रम निर्धारण कैसे और कितना करना है। इस उदाहरण में, हम सभी कर्मचारियों को वर्णानुक्रम में क्रमबद्ध करना चाहते हैं। हमें PARTITION BY क्लॉज़ की आवश्यकता नहीं है क्योंकि हम पूरे डेटासेट के सभी कर्मचारियों को क्रमबद्ध कर रहे हैं। हम ग्राहकों को उनके अंतिम नाम (last_name) के आधार पर क्रमबद्ध करेंगे। हम अपनी क्रम संख्या का नाम name_row_number रखेंगे।
SELECT e.first_name, e.last_name, e.gender, e.hire_date,
ROW_NUMBER()OVER(ORDERBY e.last_name)AS name_row_number
FROM employees.employees e;संचालित द्वारा
टाई की स्थिति (एक ही अंतिम नाम वाले कर्मचारी) को संभालने के लिए, हम क्रम निर्धारण में और कॉलम जोड़कर उसे परिष्कृत कर सकते हैं। नीचे दिए उदाहरण में, हम पहले last_name के आधार पर क्रमबद्ध करते हैं, और जिन मामलों में किसी कर्मचारी का अंतिम नाम किसी और के समान हो, वहाँ हम पहले नाम (first_name) के आधार पर क्रमबद्ध करेंगे।
SELECT e.first_name, e.last_name, e.gender, e.hire_date,
ROW_NUMBER()OVER(ORDERBY e.last_name, e.first_name)AS name_row_number
FROM employees.employees e;संचालित द्वारा
लिंग के भीतर नवीनतम नियुक्ति तिथि के अनुसार कर्मचारियों को क्रमांकित करना
अब, आइए कर्मचारियों को उनके संबंधित लिंग के भीतर नवीनतम से पुरानी नियुक्ति तिथि तक क्रमबद्ध करें। हम फिर से ORDER BY क्लॉज़ का उपयोग करके hire_date के आधार पर क्रमबद्ध करेंगे, लेकिन इस बार अवरोही क्रम (यानी DESC) में ताकि सबसे हाल की नियुक्तियों को प्राथमिकता मिले।
प्रत्येक लिंग के लिए अलग-अलग क्रम संख्या पाने के लिए, हम PARTITION BY gender क्लॉज़ जोड़ेंगे। इसका मतलब है कि प्रत्येक भिन्न लिंग के लिए पंक्ति संख्या 1 से फिर शुरू होगी।
यहाँ पूरी क्वेरी है:
SELECT e.first_name, e.last_name, e.gender, e.hire_date,
ROW_NUMBER()OVER(PARTITIONBY gender ORDERBY hire_date DESC)AS hire_row_number
FROM employees.employees e;संचालित द्वारा
इसके बाद हम प्रत्येक लिंग में सबसे अनुभवी कर्मचारी को खोजने के लिए WHERE क्लॉज़ का उपयोग करके इस डेटा को क्वेरी कर सकते हैं:
WITH RankedEmployees AS(SELECT e.first_name, e.last_name, e.gender, e.hire_date,
ROW_NUMBER()OVER(PARTITIONBY gender ORDERBY hire_date DESC)AS hire_row_number
FROM employees.employees e
)SELECT first_name, last_name, gender, hire_date
FROM RankedEmployees
WHERE hire_row_number =1;संचालित द्वारा
JOIN का उपयोग करके लिंग के भीतर वेतन के अनुसार कर्मचारियों को क्रमबद्ध करना
अंतिम उदाहरण में, हम कर्मचारियों को उनके वेतन के आधार पर, उनके लिंग को ध्यान में रखते हुए, रैंक करेंगे। इसे हासिल करने के लिए, हम employees तालिका को salaries तालिका के साथ emp_no कॉलम के आधार पर जॉइन करेंगे:
SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary
FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
LIMIT100;संचालित द्वारा
अब, हम PARTITION BY और ORDER BY दोनों का उपयोग करेंगे। हम gender के आधार पर विभाजन करेंगे ताकि प्रत्येक लिंग के लिए अलग रैंकिंग हो, और salary को अवरोही क्रम में क्रमबद्ध करेंगे ताकि सबसे अधिक वेतन पाने वाले पहले रैंक हों।
यहाँ पूरी क्वेरी है:
SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary,
ROW_NUMBER ()OVER(PARTITIONBY e.gender ORDERBY s.salary DESC)AS salary_row_number
FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
LIMIT100;संचालित द्वारा
प्रत्येक लिंग के शीर्ष वेतनों की तुलना करने के लिए, हम WHERE क्लॉज़ का उपयोग करके परिणामों को फ़िल्टर कर सकते हैं। नीचे दी गई क्वेरी प्रत्येक लिंग के शीर्ष 5 कमाई करने वालों को लौटाएगी, जिन्हें उनके लिंग समूह के भीतर उनकी रैंक के अनुसार क्रमबद्ध किया गया है। ऐसी क्वेरियाँ डेटासेट के भीतर वेतन समानता पर अंतर्दृष्टि प्रदान कर सकती हैं।
WITH RankedSalaries AS(SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary,
ROW_NUMBER()OVER(PARTITIONBY e.gender ORDERBY s.salary DESC)AS salary_row_number
FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
)SELECT first_name, last_name, gender, hire_date, salary
FROM RankedSalaries
WHERE salary_row_number <=5ORDERBY salary_row_number, gender;संचालित द्वारा
निष्कर्ष
ROW_NUMBER() फ़ंक्शन तब उपयोगी है जब हमारे पास असंगठित डेटासेट हो और हम आगे के विश्लेषण के लिए पंक्तियों को स्पष्ट क्रमवार संख्या देना चाहें। हम इन संख्याओं के विशिष्ट क्रम को ORDER BY के माध्यम से परिभाषित करते हैं और डेटा के अलग-अलग समूहों के लिए अलग क्रमिक अनुक्रम PARTITION BY का उपयोग करके तय करते हैं।
यदि आपको यह लेख उपयोगी लगा और आप SQL के बारे में और सीखना चाहते हैं, तो हमारे अन्य SQL पाठ्यक्रम देखें।
SQL में, अक्सर डेटासेट असंगठित होते हैं, जिससे विश्लेषण चुनौतीपूर्ण हो सकता है। यह समझने के लिए कि किसी डेटासेट में पंक्तियाँ एक-दूसरे से कैसे संबंधित हैं, हम
ROW_NUMBER()फ़ंक्शन का उपयोग कर सकते हैं।यह फ़ंक्शन परिणाम सेट की पंक्तियों को क्रमवार संख्याएँ देता है, जिससे आगे के संशोधन और विश्लेषण के लिए स्पष्ट क्रम मिल जाता है। यह पूरे डेटासेट के लिए या डेटासेट के भीतर अलग-अलग समूहों के लिए किया जा सकता है।
यह लेख SQL की मूल बातें पहले से जानने की धारणा पर आधारित है। हम प्रचलित
ROW_NUMBER()फ़ंक्शन की मूल बातें कवर करेंगे और बढ़ती जटिलता के उदाहरण देंगे।ROW_NUMBER()Syntaxयहाँ
ROW_NUMBER()फ़ंक्शन का मूल सिंटैक्स दिया गया है:आइए मुख्य घटकों को समझते हैं:
ROW_NUMBER(): यही स्वयं फ़ंक्शन है, जो क्रमवार पंक्ति संख्याएँ जनरेट करता है।OVER (...): यह क्लॉज़ विंडो फ़ंक्शंस जैसेROW_NUMBER()के लिए अनिवार्य है। यह वह संदर्भ परिभाषित करता है जिसमें पंक्ति संख्याएँ गणना की जाती हैं।PARTITION BY value_expression: यह वैकल्पिक क्लॉज़ निर्दिष्ट कॉलम(स्) या अभिव्यक्ति(ओं) के आधार पर परिणाम सेट को विभाजनों में बाँटता है। इसके बाद पंक्ति संख्याएँ प्रत्येक विभाजन के भीतर स्वतंत्र रूप से गणना की जाती हैं।ORDER BY order_by_clause: यह वैकल्पिक क्लॉज़ उस क्रम को निर्दिष्ट करता है जिसमें प्रत्येक विभाजन के भीतर (या यदिPARTITION BYनहीं है तो पूरे परिणाम सेट में) पंक्ति संख्याएँ आवंटित की जाती हैं।उदाहरण के लिए, व्यापक SQL क्वेरी में हम
ROW_NUMBER()का उपयोग इस प्रकार कर सकते हैं:ROW_NUMBER()Examplesनिम्नलिखित तीन उदाहरणों में, हम मुफ़्त DataLab IDE का उपयोग करेंगे। हम Employees सैंपल डेटासेट (जो पहले से DataLab में उपलब्ध है) का उपयोग करेंगे, जिसमें ये चार कॉलम हैं:
first_name: स्ट्रिंग फ़ील्डlast_name: स्ट्रिंग फ़ील्डgender: स्ट्रिंग फ़ील्ड जिसमें दो मान होते हैं (“M” या “F”)hire_date: वह तारीख जब कर्मचारी को नियुक्त किया गयाहम निम्न SQL कोड का उपयोग करके डेटासेट को क्वेरी कर सकते हैं:
कर्मचारियों को वर्णानुक्रम में क्रमांकित करना
ROW_NUMBER()का उपयोग करने से पहले, लक्ष्य तय करना महत्वपूर्ण है—इससे यह स्पष्ट होगा कि हमें विभाजन और क्रम निर्धारण कैसे और कितना करना है। इस उदाहरण में, हम सभी कर्मचारियों को वर्णानुक्रम में क्रमबद्ध करना चाहते हैं। हमेंPARTITION BYक्लॉज़ की आवश्यकता नहीं है क्योंकि हम पूरे डेटासेट के सभी कर्मचारियों को क्रमबद्ध कर रहे हैं। हम ग्राहकों को उनके अंतिम नाम (last_name) के आधार पर क्रमबद्ध करेंगे। हम अपनी क्रम संख्या का नामname_row_numberरखेंगे।टाई की स्थिति (एक ही अंतिम नाम वाले कर्मचारी) को संभालने के लिए, हम क्रम निर्धारण में और कॉलम जोड़कर उसे परिष्कृत कर सकते हैं। नीचे दिए उदाहरण में, हम पहले
last_nameके आधार पर क्रमबद्ध करते हैं, और जिन मामलों में किसी कर्मचारी का अंतिम नाम किसी और के समान हो, वहाँ हम पहले नाम (first_name) के आधार पर क्रमबद्ध करेंगे।लिंग के भीतर नवीनतम नियुक्ति तिथि के अनुसार कर्मचारियों को क्रमांकित करना
अब, आइए कर्मचारियों को उनके संबंधित लिंग के भीतर नवीनतम से पुरानी नियुक्ति तिथि तक क्रमबद्ध करें। हम फिर से
ORDER BYक्लॉज़ का उपयोग करकेhire_dateके आधार पर क्रमबद्ध करेंगे, लेकिन इस बार अवरोही क्रम (यानीDESC) में ताकि सबसे हाल की नियुक्तियों को प्राथमिकता मिले।प्रत्येक लिंग के लिए अलग-अलग क्रम संख्या पाने के लिए, हम
PARTITION BY genderक्लॉज़ जोड़ेंगे। इसका मतलब है कि प्रत्येक भिन्न लिंग के लिए पंक्ति संख्या 1 से फिर शुरू होगी।यहाँ पूरी क्वेरी है:
इसके बाद हम प्रत्येक लिंग में सबसे अनुभवी कर्मचारी को खोजने के लिए
WHEREक्लॉज़ का उपयोग करके इस डेटा को क्वेरी कर सकते हैं:JOIN का उपयोग करके लिंग के भीतर वेतन के अनुसार कर्मचारियों को क्रमबद्ध करना
अंतिम उदाहरण में, हम कर्मचारियों को उनके वेतन के आधार पर, उनके लिंग को ध्यान में रखते हुए, रैंक करेंगे। इसे हासिल करने के लिए, हम
employeesतालिका कोsalariesतालिका के साथemp_noकॉलम के आधार पर जॉइन करेंगे:अब, हम
PARTITION BYऔरORDER BYदोनों का उपयोग करेंगे। हमgenderके आधार पर विभाजन करेंगे ताकि प्रत्येक लिंग के लिए अलग रैंकिंग हो, औरsalaryको अवरोही क्रम में क्रमबद्ध करेंगे ताकि सबसे अधिक वेतन पाने वाले पहले रैंक हों।यहाँ पूरी क्वेरी है:
प्रत्येक लिंग के शीर्ष वेतनों की तुलना करने के लिए, हम
WHEREक्लॉज़ का उपयोग करके परिणामों को फ़िल्टर कर सकते हैं। नीचे दी गई क्वेरी प्रत्येक लिंग के शीर्ष 5 कमाई करने वालों को लौटाएगी, जिन्हें उनके लिंग समूह के भीतर उनकी रैंक के अनुसार क्रमबद्ध किया गया है। ऐसी क्वेरियाँ डेटासेट के भीतर वेतन समानता पर अंतर्दृष्टि प्रदान कर सकती हैं।निष्कर्ष
ROW_NUMBER()फ़ंक्शन तब उपयोगी है जब हमारे पास असंगठित डेटासेट हो और हम आगे के विश्लेषण के लिए पंक्तियों को स्पष्ट क्रमवार संख्या देना चाहें। हम इन संख्याओं के विशिष्ट क्रम कोORDER BYके माध्यम से परिभाषित करते हैं और डेटा के अलग-अलग समूहों के लिए अलग क्रमिक अनुक्रमPARTITION BYका उपयोग करके तय करते हैं।यदि आपको यह लेख उपयोगी लगा और आप SQL के बारे में और सीखना चाहते हैं, तो हमारे अन्य SQL पाठ्यक्रम देखें।