MySQL ROW_NUMBER() समझाया गया (MySQL 8.0): रैंकिंग, शीर्ष‑N क्वेरीज़, और डुप्लिकेशन हटाना

目次

1. परिचय

MySQL संस्करण 8.0 ने कई नई सुविधाओं का परिचय दिया, और सबसे उल्लेखनीय में से एक विंडो फंक्शनों का समर्थन है। इस लेख में, हम सबसे अधिक उपयोग किए जाने वाले फंक्शनों में से एक पर ध्यान केंद्रित करेंगे: ROW_NUMBER()

ROW_NUMBER() फंक्शन डेटा विश्लेषण और रिपोर्टिंग के लिए शक्तिशाली क्षमताएं प्रदान करता है, जो विशिष्ट शर्तों के आधार पर डेटा को सॉर्ट और रैंक करना आसान बनाता है। यह लेख बुनियादी उपयोग और व्यावहारिक उदाहरणों से लेकर पुराने MySQL संस्करणों के लिए वैकल्पिक दृष्टिकोणों तक सब कुछ समझाता है।

लक्षित पाठक

  • बुनियादी SQL ज्ञान वाले शुरुआती से मध्यवर्ती उपयोगकर्ता
  • इंजीनियर और डेटा विश्लेषक जो MySQL का उपयोग करके डेटा प्रोसेस और विश्लेषण करते हैं
  • कोई भी जो नवीनतम MySQL संस्करण में माइग्रेट करने पर विचार कर रहा है

ROW_NUMBER() के लाभ

यह फंक्शन आपको विशिष्ट शर्तों के आधार पर प्रत्येक पंक्ति को एक अद्वितीय संख्या आवंटित करने की अनुमति देता है। उदाहरण के लिए, आप आसानी से “बिक्री के अवरोही क्रम में रैंकिंग बनाएं” या “डुप्लिकेट डेटा निकालें और व्यवस्थित करें” जैसी क्वेरी लिख सकते हैं।

पुराने संस्करणों में, आपको अक्सर उपयोगकर्ता-परिभाषित चरों का उपयोग करके जटिल क्वेरी लिखनी पड़ती थी। ROW_NUMBER() के साथ, आपकी SQL सरल और अधिक पढ़ने योग्य हो जाती है।

इस लेख में, हम ठोस क्वेरी उदाहरणों का उपयोग करेंगे और उन्हें शुरुआती-अनुकूल तरीके से समझाएंगे। अगले अनुभाग में, हम इस फंक्शन के बुनियादी सिंटैक्स और व्यवहार को करीब से देखेंगे।

2. ROW_NUMBER() फंक्शन क्या है?

ROW_NUMBER() फंक्शन, जो MySQL 8.0 में नया जोड़ा गया है, एक प्रकार का विंडो फंक्शन है जो पंक्तियों को क्रमिक संख्याएं आवंटित करता है। यह पंक्तियों को एक विशिष्ट क्रम और/या प्रत्येक समूह के अंदर नंबरिंग कर सकता है, जो डेटा विश्लेषण और रिपोर्टिंग के लिए अत्यंत उपयोगी है। यहां हम व्यावहारिक उदाहरणों के साथ बुनियादी सिंटैक्स को विस्तार से समझाएंगे।

ROW_NUMBER() का बुनियादी सिंटैक्स

सबसे पहले, ROW_NUMBER() का बुनियादी प्रारूप निम्नलिखित है।

SELECT
    column_name,
    ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY sort_column) AS row_num
FROM
    table_name;

प्रत्येक तत्व का अर्थ

  • ROW_NUMBER() : प्रत्येक पंक्ति को एक क्रमिक संख्या आवंटित करता है।
  • OVER : विंडो फंक्शन के लिए विंडो को परिभाषित करने के लिए उपयोग किया जाने वाला कीवर्ड।
  • PARTITION BY : निर्दिष्ट कॉलम द्वारा डेटा को समूहित करता है। वैकल्पिक। यदि छोड़ा जाए, तो सभी पंक्तियों पर नंबरिंग लागू होती है।
  • ORDER BY : संख्याएं आवंटित करने के लिए उपयोग किया जाने वाला क्रम निर्धारित करता है, अर्थात् सॉर्टिंग मानदंड।

बुनियादी उदाहरण

उदाहरण के लिए, मान लीजिए कि आपके पास “sales” नामक एक तालिका है जिसमें निम्नलिखित डेटा है।

employeedepartmentsale
ASales Department500
BSales Department800
CDevelopment Department600
DDevelopment Department700

प्रत्येक विभाग में बिक्री के अवरोही क्रम में क्रमिक संख्याएं आवंटित करने के लिए, निम्नलिखित क्वेरी का उपयोग करें।

SELECT
    employee,
    department,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS row_num
FROM
    sales;

परिणाम

employeedepartmentsalerow_num
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

इस परिणाम से, आप देख सकते हैं कि प्रत्येक विभाग के अंदर बिक्री के आधार पर रैंकिंग प्रदर्शित की गई है

PARTITION BY का उपयोग कैसे करें

उपरोक्त उदाहरण में, डेटा को “department” कॉलम द्वारा समूहित किया गया है। यह प्रत्येक विभाग के लिए एक अलग अनुक्रम आवंटित करता है।

यदि आप PARTITION BY को छोड़ देते हैं, तो नंबरिंग सभी पंक्तियों पर एक अनुक्रम के रूप में आवंटित की जाती है।

SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (ORDER BY sale DESC) AS row_num
FROM
    sales;

परिणाम

employeesalerow_num
B8001
D7002
C6003
A5004

ROW_NUMBER() की विशेषताएं और सावधानियां

  • अद्वितीय नंबरिंग : भले ही मान समान हों, आवंटित संख्याएं अद्वितीय होती हैं।
  • NULLs का हैंडलिंग : यदि ORDER BY में NULLs शामिल हैं, तो वे आरोही क्रम में पहले और अवरोही क्रम में अंत में दिखाई देते हैं।
  • प्रदर्शन प्रभाव : बड़े डेटासेट के लिए, ORDER BY महंगा हो सकता है, इसलिए उचित इंडेक्सिंग महत्वपूर्ण है।

3. व्यावहारिक उपयोग के मामले

यहां MySQL के ROW_NUMBER() फंक्शन का उपयोग करने के व्यावहारिक परिदृश्य दिए गए हैं। यह फंक्शन डेटा रैंकिंग और डुप्लिकेट्स हैंडलिंग जैसे कई वास्तविक दुनिया के मामलों में उपयोगी है।

3-1. प्रत्येक समूह के अंदर रैंकिंग

उदाहरण के लिए, मान लीजिए आप बिक्री डेटा का उपयोग करके “प्रत्येक विभाग में बिक्री के आधार पर कर्मचारियों को रैंक” करना चाहते हैं। नीचे दिया गया डेटासेट उदाहरण के रूप में उपयोग करें।

employeedepartmentsale
ASales Department500
BSales Department800
CDevelopment Department600
DDevelopment Department700

क्वेरी उदाहरण: विभाग के अनुसार बिक्री रैंकिंग

SELECT
    employee,
    department,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales;

परिणाम:

employeedepartmentsalerank
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

इस प्रकार, प्रत्येक विभाग को बिक्री के अवरोही क्रम में अपना क्रमांक मिलता है, जिससे रैंकिंग बनाना आसान हो जाता है।

3-2. शीर्ष N पंक्तियों को निकालना

अब, देखते हैं कि आप “प्रत्येक विभाग में बिक्री के आधार पर शीर्ष 3 कर्मचारियों को निकालना” चाहते हैं।

क्वेरी उदाहरण: शीर्ष N पंक्तियों को निकालें

WITH RankedSales AS (
    SELECT
        employee,
        department,
        sale,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
    FROM
        sales
)
SELECT
    employee,
    department,
    sale
FROM
    RankedSales
WHERE
    rank <= 3;

परिणाम:

employeedepartmentsale
BSales Department800
ASales Department500
DDevelopment Department700
CDevelopment Department600

यह उदाहरण प्रत्येक विभाग में बिक्री के आधार पर केवल शीर्ष 3 पंक्तियों को प्राप्त करता है। जैसा कि आप देख सकते हैं, ROW_NUMBER() न केवल रैंकिंग के लिए बल्कि शीर्ष परिणामों को फ़िल्टर करने के लिए भी उपयुक्त है।

3-3. डुप्लिकेट डेटा को ढूँढना और हटाना

डेटाबेस में कभी-कभी डुप्लिकेट रिकॉर्ड होते हैं। ऐसे मामलों में, आप ROW_NUMBER() का उपयोग करके उन्हें आसानी से संभाल सकते हैं।

क्वेरी उदाहरण: डुप्लिकेट का पता लगाएँ

SELECT *
FROM (
    SELECT
        employee,
        sale,
        ROW_NUMBER() OVER (PARTITION BY employee ORDER BY sale DESC) AS rank
    FROM
        sales
) tmp
WHERE rank > 1;

यह क्वेरी तब डुप्लिकेट का पता लगाती है जब एक ही कर्मचारी नाम के लिए कई रिकॉर्ड मौजूद होते हैं।

क्वेरी उदाहरण: डुप्लिकेट हटाएँ

DELETE FROM sales
WHERE id IN (
    SELECT id
    FROM (
        SELECT
            id,
            ROW_NUMBER() OVER (PARTITION BY employee ORDER BY sale DESC) AS rank
        FROM
            sales
    ) tmp
    WHERE rank > 1
);

सारांश

ROW_NUMBER() विभिन्न परिदृश्यों में उपयोगी है, जैसे:

  1. प्रत्येक समूह के भीतर रैंकिंग
  2. शीर्ष N पंक्तियों को निकालना
  3. डुप्लिकेट का पता लगाना और हटाना

यह जटिल डेटा प्रोसेसिंग और विश्लेषण को सरल और अधिक कुशल बनाता है।

4. अन्य विंडो फ़ंक्शनों की तुलना

MySQL 8.0 में, ROW_NUMBER() के अलावा, RANK() और DENSE_RANK() जैसे विंडो फ़ंक्शन भी हैं जिन्हें रैंकिंग और स्थिति गणना के लिए उपयोग किया जा सकता है। जबकि इनके कार्य समान हैं, उनका व्यवहार और परिणाम अलग होते हैं। यहाँ हम प्रत्येक फ़ंक्शन की तुलना करेंगे और बताएँगे कि उन्हें कब उपयोग करना चाहिए।

4-1. RANK() फ़ंक्शन

RANK() फ़ंक्शन रैंक असाइन करता है, समान मानों को समान रैंक देता है और अगले रैंक नंबर को छोड़ देता है।

मूल सिंटैक्स

SELECT
    column_name,
    RANK() OVER (PARTITION BY group_column ORDER BY sort_column) AS rank
FROM
    table_name;

उदाहरण

निम्नलिखित डेटा का उपयोग करके, बिक्री रैंक की गणना करें।

employeedepartmentsale
ASales Department800
BSales Department800
CSales Department600
DSales Department500

क्वेरी उदाहरण: RANK() का उपयोग

SELECT
    employee,
    sale,
    RANK() OVER (ORDER BY sale DESC) AS rank
FROM
    sales;

परिणाम:

employeesalerank
A8001
B8001
C6003
D5004

मुख्य बिंदु:

  • समान बिक्री राशि (800) वाले A और B दोनों को रैंक “1” माना जाता है।
  • अगला रैंक “2” छोड़ दिया जाता है, इसलिए C रैंक “3” प्राप्त करता है।

4-2. DENSE_RANK() फ़ंक्शन

DENSE_RANK() फ़ंक्शन भी समान मानों को समान रैंक देता है, लेकिन यह अगले रैंक नंबर को नहीं छोड़ता।

मूल सिंटैक्स

SELECT
    column_name,
    DENSE_RANK() OVER (PARTITION BY group_column ORDER BY sort_column) AS dense_rank
FROM
    table_name;

उदाहरण

ऊपर के समान डेटा का उपयोग करके, DENSE_RANK() फ़ंक्शन आज़माएँ।

क्वेरी उदाहरण: DENSE_RANK() का उपयोग

SELECT
    employee,
    sale,
    DENSE_RANK() OVER (ORDER BY sale DESC) AS dense_rank
FROM
    sales;

परिणाम:

employeesaledense_rank
A8001
B8001
C6002
D5003

मुख्य बिंदु:

  • समान बिक्री राशि (800) वाले A और B दोनों को रैंक “1” माना जाता है।
  • RANK() के विपरीत, अगला रैंक “2” से शुरू होता है, इसलिए रैंकिंग निरंतरता बनी रहती है।

4-3. ROW_NUMBER() कैसे अलग है

ROW_NUMBER() फ़ंक्शन अन्य दो से इस बात में अलग है कि यह एक अद्वितीय संख्या असाइन करता है, भले ही मान समान हों।

उदाहरण

SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (ORDER BY sale DESC) AS row_num
FROM
    sales;

परिणाम:

employeesalerow_num
A8001
B8002
C6003
D5004

मुख्य बिंदु:

  • यदि मान समान हों, तो प्रत्येक पंक्ति को एक अद्वितीय संख्या मिलती है, इसलिए कोई डुप्लिकेट रैंक नहीं होते।
  • यह तब उपयोगी होता है जब आपको सख्त क्रम नियंत्रण या प्रति‑पंक्ति अद्वितीयता की आवश्यकता होती है।

4-4. त्वरित उपयोग‑केस सारांश

FunctionRanking behaviorTypical use case
ROW_NUMBER()Assigns a unique numberWhen you need sequential numbering or unique identification per row
RANK()Same rank for ties; skips the next rank numberWhen you want rankings with gaps reflecting ties
DENSE_RANK()Same rank for ties; does not skip rank numbersWhen you want continuous ranks without gaps

सारांश

ROW_NUMBER(), RANK(), और DENSE_RANK() को स्थिति के अनुसार उपयुक्त रूप से उपयोग किया जाना चाहिए।

  1. ROW_NUMBER() सबसे अच्छा है जब आपको प्रत्येक पंक्ति के लिए अद्वितीय संख्याएँ चाहिए।
  2. RANK() उपयोगी है जब आप चाहते हैं कि टाई वाले रिकॉर्ड एक ही रैंक साझा करें और रैंक अंतर को उजागर करना चाहते हैं।
  3. DENSE_RANK() उपयुक्त है जब आप बिना अंतर के निरंतर रैंक चाहते हैं।

5. MySQL संस्करण 8.0 से नीचे के लिए विकल्प

MySQL 8.0 से पहले के संस्करणों में, ROW_NUMBER() और अन्य विंडो फ़ंक्शन समर्थित नहीं हैं। हालांकि, आप उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग करके समान व्यवहार प्राप्त कर सकते हैं। यह अनुभाग MySQL 8.0 से नीचे के संस्करणों के लिए व्यावहारिक विकल्पों को समझाता है।

5-1. उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग करके क्रमिक क्रमांक

MySQL 5.7 और उससे पहले, आप उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग करके प्रत्येक पंक्ति को क्रमिक संख्या असाइन कर सकते हैं। चलिए निम्नलिखित उदाहरण देखते हैं।

उदाहरण: विभाग द्वारा बिक्री रैंकिंग

नमूना डेटा:

employeedepartmentsale
ASales Department500
BSales Department800
CDevelopment Department600
DDevelopment Department700

क्वेरी:

SET @row_num = 0;
SET @dept = '';

SELECT
    employee,
    department,
    sale,
    @row_num := IF(@dept = department, @row_num + 1, 1) AS rank,
    @dept := department
FROM
    (SELECT * FROM sales ORDER BY department, sale DESC) AS sorted_sales;

परिणाम:

employeedepartmentsalerank
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

5-2. शीर्ष N पंक्तियों को निकालना

शीर्ष N पंक्तियों को प्राप्त करने के लिए, आप समान तरीके से उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग कर सकते हैं।

क्वेरी:

SET @row_num = 0;
SET @dept = '';

SELECT *
FROM (
    SELECT
        employee,
        department,
        sale,
        @row_num := IF(@dept = department, @row_num + 1, 1) AS rank,
        @dept := department
    FROM
        (SELECT * FROM sales ORDER BY department, sale DESC) AS sorted_sales
) AS ranked_sales
WHERE rank <= 3;

परिणाम:

employeedepartmentsalerank
BSales Department8001
ASales Department5002
DDevelopment Department7001
CDevelopment Department6002

यह क्वेरी विभाग के अनुसार रैंक असाइन करती है और फिर केवल शीर्ष 3 पंक्तियों को निकालती है।

5-3. डुप्लिकेट का पता लगाना और हटाना

आप उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग करके डुप्लिकेट डेटा को भी संभाल सकते हैं।

क्वेरी उदाहरण: डुप्लिकेट खोजें

SET @row_num = 0;
SET @id_check = '';

SELECT *
FROM (
    SELECT
        id,
        name,
        @row_num := IF(@id_check = name, @row_num + 1, 1) AS rank,
        @id_check := name
    FROM
        (SELECT * FROM customers ORDER BY name, id) AS sorted_customers
) AS tmp
WHERE rank > 1;

क्वेरी उदाहरण: डुप्लिकेट हटाएँ

DELETE FROM customers
WHERE id IN (
    SELECT id
    FROM (
        SELECT
            id,
            @row_num := IF(@id_check = name, @row_num + 1, 1) AS rank,
            @id_check := name
        FROM
            (SELECT * FROM customers ORDER BY name, id) AS sorted_customers
    ) AS tmp
    WHERE rank > 1
);

5-4. उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग करते समय सावधानियां

  1. सत्र निर्भरता
  • उपयोगकर्ता‑परिभाषित वेरिएबल्स केवल वर्तमान सत्र में मान्य होते हैं। इन्हें विभिन्न क्वेरी या सत्रों में पुनः उपयोग नहीं किया जा सकता।
  1. प्रसंस्करण क्रम पर निर्भरता
  • उपयोगकर्ता‑परिभाषित वेरिएबल्स निष्पादन क्रम पर निर्भर होते हैं, इसलिए ORDER BY को सही ढंग से सेट करना महत्वपूर्ण है।
  1. SQL पठनीयता और रखरखाव
  • क्वेरी जटिल हो सकती हैं, इसलिए MySQL 8.0 और बाद में विंडो फ़ंक्शन का उपयोग करने की सलाह दी जाती है।

सारांश

In MySQL के 8.0 से नीचे के संस्करणों में, आप उपयोगकर्ता‑परिभाषित वेरिएबल्स का उपयोग करके विंडो फ़ंक्शन्स के स्थान पर क्रमिक क्रमांक और रैंकिंग लागू कर सकते हैं। हालांकि, क्योंकि क्वेरीज़ अधिक जटिल हो जाती हैं, संभव हो तो नए संस्करण में माइग्रेट करने पर विचार करना बेहतर है।

6. सावधानियां और सर्वोत्तम प्रथाएं

MySQL का ROW_NUMBER() फ़ंक्शन और वेरिएबल‑आधारित विकल्प बहुत सुविधाजनक हैं, लेकिन उन्हें सटीक और कुशलता से चलाने के लिए कुछ महत्वपूर्ण बिंदुओं को ध्यान में रखना आवश्यक है। यह अनुभाग प्रदर्शन अनुकूलन के लिए व्यावहारिक सावधानियों और सर्वोत्तम प्रथाओं को समझाता है।

6-1. प्रदर्शन संबंधी विचार

1. ORDER BY लागत

ROW_NUMBER() हमेशा ORDER BY के साथ उपयोग किया जाता है। चूंकि इसे सॉर्टिंग की आवश्यकता होती है, बड़े डेटासेट के लिए प्रोसेसिंग समय में काफी वृद्धि हो सकती है।

निवारण:

  • इंडेक्स का उपयोग करें: ORDER BY में उपयोग किए गए कॉलमों पर इंडेक्स जोड़ें ताकि सॉर्टिंग तेज हो सके।
  • LIMIT का उपयोग करें: केवल उतनी ही पंक्तियों को प्राप्त करें जितनी आपको वास्तव में चाहिए, ताकि प्रोसेस किए जाने वाले डेटा की मात्रा कम हो।

उदाहरण:

SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales
LIMIT 1000;

2. बढ़ी हुई मेमोरी उपयोग और डिस्क I/O

विंडो फ़ंक्शन्स अस्थायी तालिकाओं और मेमोरी का उपयोग करके प्रोसेस किए जाते हैं। जैसे‑जैसे डेटा की मात्रा बढ़ती है, मेमोरी खपत और डिस्क I/O बढ़ सकता है।

निवारण:

  • क्वेरीज़ को विभाजित करें: प्रोसेसिंग को छोटे क्वेरीज़ में बाँटें और डेटा को चरण‑दर‑चरण निकालें ताकि लोड कम हो।
  • अस्थायी तालिकाओं का उपयोग करें: निकाले गए डेटा को एक अस्थायी तालिका में संग्रहीत करें और वहाँ से एग्रीगेशन चलाएँ ताकि कार्यभार वितरित हो सके।

6-2. क्वेरी ट्यूनिंग टिप्स

1. निष्पादन योजना जांचें

MySQL में, आप EXPLAIN का उपयोग करके क्वेरी निष्पादन योजना की जाँच कर सकते हैं। यह आपको यह सत्यापित करने में मदद करता है कि इंडेक्स सही ढंग से उपयोग हो रहे हैं या नहीं।

उदाहरण:

EXPLAIN
SELECT
    employee,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales;

उदाहरण आउटपुट:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1SIMPLEsalesindexNULLsale4NULL500Using index

यदि आप Using index देखते हैं, तो इसका मतलब है कि इंडेक्स उपयुक्त रूप से उपयोग हो रहा है।

2. इंडेक्स को अनुकूलित करें

ORDER BY और WHERE में उपयोग किए गए कॉलमों पर इंडेक्स जोड़ना सुनिश्चित करें। निम्नलिखित पर विशेष ध्यान दें।

  • सिंगल‑कलम इंडेक्स: सरल सॉर्ट शर्तों के लिए उपयुक्त
  • कॉम्पोजिट इंडेक्स: जब कई कॉलम शर्तों में शामिल हों तो प्रभावी

उदाहरण:

CREATE INDEX idx_department_sale ON sales(department, sale DESC);

3. बैच प्रोसेसिंग का उपयोग करें

एक बड़े डेटासेट को एक बार में प्रोसेस करने के बजाय, आप डेटा को बैचों में प्रोसेस करके लोड कम कर सकते हैं।

उदाहरण:

SELECT * FROM sales WHERE department = 'Sales Department' LIMIT 1000 OFFSET 0;
SELECT * FROM sales WHERE department = 'Sales Department' LIMIT 1000 OFFSET 1000;

6-3. डेटा संगति बनाए रखना

1. अपडेट्स और पुनर्गणना

जब पंक्तियों को जोड़ा या हटाया जाता है, तो क्रमांक बदल सकता है। आवश्यकतानुसार संख्याओं को पुनः गणना करने के लिए एक तंत्र बनाएं।

उदाहरण:

CREATE VIEW ranked_sales AS
SELECT
    employee,
    sale,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
FROM
    sales;

एक व्यू का उपयोग करने से आप नवीनतम डेटा के आधार पर रैंकिंग को अद्यतन रख सकते हैं।

6-4. सर्वोत्तम‑प्रथा क्वेरी उदाहरण

नीचे एक ऐसा उदाहरण है जो प्रदर्शन और रखरखाव को ध्यान में रखते हुए सर्वोत्तम प्रथाओं को दर्शाता है।

उदाहरण: शीर्ष N पंक्तियों को निकालें

WITH RankedSales AS (
    SELECT
        employee,
        department,
        sale,
        ROW_NUMBER() OVER (PARTITION BY department ORDER BY sale DESC) AS rank
    FROM
        sales
)
SELECT *
FROM RankedSales
WHERE rank <= 3;

यह संरचना पठनीयता और पुनः उपयोगिता को बढ़ाने के लिए एक कॉमन टेबल एक्सप्रेशन (CTE) का उपयोग करती है।

सारांश

जब ROW_NUMBER() या उसके विकल्पों का उपयोग करें, तो इन बिंदुओं को याद रखें:

  1. इंडेक्स अनुकूलन के माध्यम से गति बढ़ाएँ।
  2. एक्जीक्यूशन प्लान की जाँच करके बॉटलनेक की पहचान करें।
  3. डेटा अपडेट की योजना बनाएँ और संगति बनाए रखें।
  4. बैच प्रोसेसिंग और CTEs का उपयोग करके लोड वितरित करें।

इन सर्वोत्तम प्रथाओं को लागू करने से बड़े पैमाने पर डेटा विश्लेषण और रिपोर्टिंग के लिए कुशल प्रसंस्करण संभव होगा।

7. निष्कर्ष

इस लेख में, हमने MySQL के ROW_NUMBER() फ़ंक्शन पर ध्यान केंद्रित किया, बुनियादी उपयोग, व्यावहारिक उदाहरणों से लेकर पुराने संस्करणों के विकल्प, साथ ही चेतावनियों और सर्वोत्तम प्रथाओं तक सब कुछ समझाया। इस भाग में, हम मुख्य बिंदुओं को दोहराएंगे और व्यावहारिक निष्कर्षों का सारांश देंगे।

7-1. ROW_NUMBER() क्यों उपयोगी है

ROW_NUMBER() फ़ंक्शन डेटा विश्लेषण और रिपोर्टिंग के लिए निम्नलिखित तरीकों से विशेष रूप से सुविधाजनक है:

  1. समूहों के भीतर क्रमिक क्रमांकन: विभाग या श्रेणी-आधारित रैंकिंग द्वारा आसानी से बिक्री रैंक बनाना।
  2. शीर्ष N पंक्तियों का निष्कर्षण: विशिष्ट शर्तों के आधार पर डेटा को कुशलतापूर्वक फ़िल्टर और निकालना।
  3. डुप्लिकेट का पता लगाना और हटाना: डेटा सफाई और संगठन के लिए उपयोगी।

क्योंकि यह जटिल क्वेरीज़ को सरल बनाता है, यह SQL की पठनीयता और रखरखाव को काफी सुधारता है।

7-2. अन्य विंडो फ़ंक्शनों के साथ तुलना

RANK() और DENSE_RANK() जैसे विंडो फ़ंक्शनों की तुलना में, ROW_NUMBER() इस बात में अलग है कि यह समान मानों के लिए भी एक अद्वितीय संख्या असाइन करता है।

FunctionFeatureUse case
ROW_NUMBER()Assigns a unique sequential number to each rowBest when you need unique identification or ranking with no duplicates
RANK()Same rank for ties; skips the next rank numberWhen you need tie-aware rankings and rank gaps matter
DENSE_RANK()Same rank for ties; does not skip rank numbersWhen you want continuous ranking while handling ties

सही फ़ंक्शन चुनना:
अपने उद्देश्य के लिए सर्वोत्तम फ़ंक्शन का चयन करने से कुशल डेटा प्रसंस्करण संभव होता है।

7-3. पुराने MySQL संस्करणों को संभालना

MySQL 8.0 से नीचे के वातावरण के लिए, हमने उपयोगकर्ता-परिभाषित वेरिएबल्स का उपयोग करके तरीकों को भी प्रस्तुत किया। हालांकि, आपको इन चेतावनियों पर विचार करना चाहिए:

  • अधिक जटिल SQL के कारण पठनीयता में कमी
  • कुछ मामलों में क्वेरी अनुकूलन अधिक कठिन हो सकता है
  • डेटा संगति बनाए रखने के लिए अतिरिक्त हैंडलिंग की आवश्यकता हो सकती है

यदि संभव हो, तो MySQL 8.0 या बाद के संस्करण में माइग्रेट करने और विंडो फ़ंक्शनों का उपयोग करने पर दृढ़ता से विचार करें।

7-4. प्रदर्शन अनुकूलन के मुख्य बिंदु

  1. इंडेक्स का उपयोग करें: गति बढ़ाने के लिए ORDER BY में उपयोग किए गए कॉलम में इंडेक्स जोड़ें।
  2. एक्जीक्यूशन प्लान जांचें: EXPLAIN के साथ पहले से प्रदर्शन को सत्यापित करें।
  3. बैच प्रोसेसिंग अपनाएँ: बड़े डेटासेट को छोटे हिस्सों में प्रोसेस करके लोड वितरित करें।
  4. व्यू और CTEs का उपयोग करें: पुन: उपयोगिता बढ़ाएँ और जटिल क्वेरीज़ को सरल बनाएँ।

इन तकनीकों को लागू करके, आप कुशल और स्थिर डेटा प्रसंस्करण प्राप्त कर सकते हैं।

7-5. अंतिम नोट्स

ROW_NUMBER() एक शक्तिशाली उपकरण है जो डेटा विश्लेषण की दक्षता को काफी बढ़ा सकता है।
इस लेख में, हमने बुनियादी सिंटैक्स और व्यावहारिक उदाहरणों से लेकर चेतावनियों और विकल्पों तक सब कुछ कवर किया।

हम आपको इस लेख के साथ पढ़ते हुए स्वयं क्वेरी चलाने के लिए प्रोत्साहित करते हैं। अपने SQL कौशल को सुधारने से आप अधिक जटिल डेटा विश्लेषण और रिपोर्टिंग को आत्मविश्वास के साथ संभाल सकते हैं।

परिशिष्ट: संदर्भ संसाधन

  • आधिकारिक दस्तावेज़: MySQL Window Functions
  • ऑनलाइन SQL वातावरण: SQL Fiddle (एक उपकरण जो आपको ऑनलाइन SQL चलाने और परीक्षण करने देता है)