मुख्य सामग्री पर जाएँ

ROW_NUMBER SQL फ़ंक्शन: पंक्तियों की क्रम संख्या कैसे दिखाएँ

ROW_NUMBER() SQL फ़ंक्शन किसी परिणाम सेट की पंक्तियों को क्रमवार पूर्णांक देता है, वैकल्पिक रूप से डेटा को विभाजित करता है और प्रत्येक विभाजन के भीतर पंक्तियों का क्रम तय करता है।
· 6 मि॰ पढ़ें

AI के साथ खोजें

SQL में, अक्सर डेटासेट असंगठित होते हैं, जिससे विश्लेषण चुनौतीपूर्ण हो सकता है। यह समझने के लिए कि किसी डेटासेट में पंक्तियाँ एक-दूसरे से कैसे संबंधित हैं, हम ROW_NUMBER() फ़ंक्शन का उपयोग कर सकते हैं।

यह फ़ंक्शन परिणाम सेट की पंक्तियों को क्रमवार संख्याएँ देता है, जिससे आगे के संशोधन और विश्लेषण के लिए स्पष्ट क्रम मिल जाता है। यह पूरे डेटासेट के लिए या डेटासेट के भीतर अलग-अलग समूहों के लिए किया जा सकता है। 

यह लेख SQL की मूल बातें पहले से जानने की धारणा पर आधारित है। हम प्रचलित ROW_NUMBER() फ़ंक्शन की मूल बातें कवर करेंगे और बढ़ती जटिलता के उदाहरण देंगे।

ROW_NUMBER() Syntax

यहाँ ROW_NUMBER() फ़ंक्शन का मूल सिंटैक्स दिया गया है:

ROW_NUMBER() OVER([PARTITION BY value expression, ... ] [ORDER BY 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(PARTITION BY group_1, ORDER BY number DESC) AS rn
FROM Data;

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
LIMIT 100; -- Optionally reduce the size of the output

Employees डेटासेट का नमूना

कर्मचारियों को वर्णानुक्रम में क्रमांकित करना

ROW_NUMBER() का उपयोग करने से पहले, लक्ष्य तय करना महत्वपूर्ण है—इससे यह स्पष्ट होगा कि हमें विभाजन और क्रम निर्धारण कैसे और कितना करना है। इस उदाहरण में, हम सभी कर्मचारियों को वर्णानुक्रम में क्रमबद्ध करना चाहते हैं। हमें PARTITION BY क्लॉज़ की आवश्यकता नहीं है क्योंकि हम पूरे डेटासेट के सभी कर्मचारियों को क्रमबद्ध कर रहे हैं। हम ग्राहकों को उनके अंतिम नाम (last_name) के आधार पर क्रमबद्ध करेंगे। हम अपनी क्रम संख्या का नाम name_row_number रखेंगे।

SELECT e.first_name, e.last_name, e.gender, e.hire_date,
    ROW_NUMBER() OVER(ORDER BY e.last_name) AS name_row_number    
FROM employees.employees e;

ROW_NUMBER() का आउटपुट

टाई की स्थिति (एक ही अंतिम नाम वाले कर्मचारी) को संभालने के लिए, हम क्रम निर्धारण में और कॉलम जोड़कर उसे परिष्कृत कर सकते हैं। नीचे दिए उदाहरण में, हम पहले last_name के आधार पर क्रमबद्ध करते हैं, और जिन मामलों में किसी कर्मचारी का अंतिम नाम किसी और के समान हो, वहाँ हम पहले नाम (first_name) के आधार पर क्रमबद्ध करेंगे।

SELECT e.first_name, e.last_name, e.gender, e.hire_date,
    ROW_NUMBER() OVER(ORDER BY e.last_name, e.first_name) AS name_row_number    
FROM employees.employees e;

कई ORDER BY कॉलम के साथ ROW_NUMBER() का परिणाम

लिंग के भीतर नवीनतम नियुक्ति तिथि के अनुसार कर्मचारियों को क्रमांकित करना

अब, आइए कर्मचारियों को उनके संबंधित लिंग के भीतर नवीनतम से पुरानी नियुक्ति तिथि तक क्रमबद्ध करें। हम फिर से ORDER BY क्लॉज़ का उपयोग करके hire_date के आधार पर क्रमबद्ध करेंगे, लेकिन इस बार अवरोही क्रम (यानी DESC) में ताकि सबसे हाल की नियुक्तियों को प्राथमिकता मिले।

प्रत्येक लिंग के लिए अलग-अलग क्रम संख्या पाने के लिए, हम PARTITION BY gender क्लॉज़ जोड़ेंगे। इसका मतलब है कि प्रत्येक भिन्न लिंग के लिए पंक्ति संख्या 1 से फिर शुरू होगी।

यहाँ पूरी क्वेरी है:

SELECT e.first_name, e.last_name, e.gender, e.hire_date,
    ROW_NUMBER() OVER(PARTITION BY gender ORDER BY hire_date DESC) AS hire_row_number    
FROM employees.employees e;

PARTITION BY() के साथ ROW_NUMBER() का उदाहरण

इसके बाद हम प्रत्येक लिंग में सबसे अनुभवी कर्मचारी को खोजने के लिए WHERE क्लॉज़ का उपयोग करके इस डेटा को क्वेरी कर सकते हैं:

WITH RankedEmployees AS (
    SELECT e.first_name, e.last_name, e.gender, e.hire_date,
        ROW_NUMBER() OVER(PARTITION BY gender ORDER BY 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;

WHERE के साथ ROW_NUMBER() का उदाहरण

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
LIMIT 100;

जॉइन की गई तालिकाओं का डेटा

अब, हम PARTITION BY और ORDER BY दोनों का उपयोग करेंगे। हम gender के आधार पर विभाजन करेंगे ताकि प्रत्येक लिंग के लिए अलग रैंकिंग हो, और salary को अवरोही क्रम में क्रमबद्ध करेंगे ताकि सबसे अधिक वेतन पाने वाले पहले रैंक हों।

यहाँ पूरी क्वेरी है:

SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary,
    ROW_NUMBER () OVER(PARTITION BY e.gender ORDER BY s.salary DESC) AS salary_row_number
    FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
LIMIT 100;

ROW_NUMBER() का उदाहरण

प्रत्येक लिंग के शीर्ष वेतनों की तुलना करने के लिए, हम WHERE क्लॉज़ का उपयोग करके परिणामों को फ़िल्टर कर सकते हैं। नीचे दी गई क्वेरी प्रत्येक लिंग के शीर्ष 5 कमाई करने वालों को लौटाएगी, जिन्हें उनके लिंग समूह के भीतर उनकी रैंक के अनुसार क्रमबद्ध किया गया है। ऐसी क्वेरियाँ डेटासेट के भीतर वेतन समानता पर अंतर्दृष्टि प्रदान कर सकती हैं।

WITH RankedSalaries AS (
    SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary,
        ROW_NUMBER() OVER(PARTITION BY e.gender ORDER BY 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 <= 5
ORDER BY salary_row_number, gender;

ROW_NUMBER() का उदाहरण

निष्कर्ष

ROW_NUMBER() फ़ंक्शन तब उपयोगी है जब हमारे पास असंगठित डेटासेट हो और हम आगे के विश्लेषण के लिए पंक्तियों को स्पष्ट क्रमवार संख्या देना चाहें। हम इन संख्याओं के विशिष्ट क्रम को ORDER BY के माध्यम से परिभाषित करते हैं और डेटा के अलग-अलग समूहों के लिए अलग क्रमिक अनुक्रम PARTITION BY का उपयोग करके तय करते हैं।

यदि आपको यह लेख उपयोगी लगा और आप SQL के बारे में और सीखना चाहते हैं, तो हमारे अन्य SQL पाठ्यक्रम देखें।

लेखक

Kevin Babitz

डेटा साइंस लेखक | Wayfair में सीनियर टेक्निकल मार्केटिंग एनालिस्ट | यूनिवर्सिटी ऑफ पेनसिल्वेनिया से डेटा साइंस में MSE

विषय