Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL 8.0 में ROW_NUMBER() विंडो फ़ंक्शन से SELECT क्वेरी में पंक्ति संख्या (रैंक) जोड़ें

MySQL 8.0+ में ROW_NUMBER() विंडो फ़ंक्शन का उपयोग करके SELECT क्वेरी के परिणाम सेट में क्रमिक पंक्ति संख्या (रैंक) जोड़ सकते हैं। यह पेजिनेशन, रैंकिंग, और पंक्ति पहचान के लिए मानक, घोषणात्मक तरीका है।

सिंटैक्स

SELECT 
    column_list,
    ROW_NUMBER() OVER (ORDER BY sort_column [ASC|DESC]) AS Rank
FROM table_name;

व्यावहारिक उदाहरण

टेबल बनाएं:

mysql> CREATE TABLE DemoTable1342 (Score INT);

डेटा डालें:

mysql> INSERT INTO DemoTable1342 VALUES(80);
mysql> INSERT INTO DemoTable1342 VALUES(98);
mysql> INSERT INTO DemoTable1342 VALUES(78);
mysql> INSERT INTO DemoTable1342 VALUES(89);

डेटा देखें:

mysql> SELECT * FROM DemoTable1342;
+-------+
| Score |
+-------+
| 80    |
| 98    |
| 78    |
| 89    |
+-------+

Score के अवरोही क्रम में रैंक जोड़ें

mysql> SELECT Score, ROW_NUMBER() OVER (ORDER BY Score DESC) AS `Rank` 
    -> FROM DemoTable1342;

परिणाम

+-------+------+
| Score | Rank |
+-------+------+
| 98    | 1    |
| 89    | 2    |
| 80    | 3    |
| 78    | 4    |
+-------+------+

विंडो फ़ंक्शन क्लॉज

अन्य रैंकिंग फ़ंक्शन (MySQL 8.0+)

क्लॉजउद्देश्यउदाहरण
PARTITION BYसमूह के भीतर रैंक रीसेटOVER (PARTITION BY dept ORDER BY salary DESC)
ORDER BYक्रमबद्धता क्रम (आवश्यक)OVER (ORDER BY score DESC)
FRAMEविंडो फ्रेम (डिफ़ॉल्ट: UNBOUNDED PRECEDING TO CURRENT ROW)आमतौर पर ROW_NUMBER के लिए अनावश्यक

पार्टिशन द्वारा रैंक (प्रति समूह)

SELECT 
    Department, Employee, Salary,
    ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS DeptRank
FROM employees;

पेजिनेशन के लिए उपयोग

-- पेज 3, आकार 10 (पंक्ति 21-30)
WITH ranked AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY created_at DESC) AS rn
    FROM posts
)
SELECT * FROM ranked WHERE rn BETWEEN 21 AND 30;

MySQL 5.7 और पहले (विंडो फ़ंक्शन नहीं)

-- उपयोगकर्ता चर (अनिश्चित क्रम के लिए भरोसेमंद नहीं)
SELECT @rn := @rn + 1 AS Rank, Score
FROM DemoTable1342, (SELECT @rn := 0) AS vars
ORDER BY Score DESC;

⚠️ चेतावनी: MySQL 5.7 में चर-आधारित रैंकिंग **आधिकारिक रूप से समर्थित नहीं** है और गलत परिणाम दे सकती है।

प्रदर्शन

  • विंडो फ़ंक्शन ऑप्टिमाइज़र द्वारा कुशलता से निष्पादित होते हैं
  • ORDER BY कॉलम पर इंडेक्स होने पर बहुत तेज़
  • फुल टेबल स्कैन + सॉर्ट की आवश्यकता होती है यदि कोई उपयुक्त इंडेक्स नहीं

सारांश

  • ROW_NUMBER() OVER (ORDER BY ...) - MySQL 8.0+ मानक तरीका
  • कोई GROUP BY आवश्यक नहीं - मूल पंक्तियां संरक्षित रहती हैं
  • PARTITION BY समूह-वार रैंकिंग के लिए
  • RANK()/DENSE_RANK() टाई हैंडलिंग के लिए
  • पेजिनेशन, लीडरबोर्ड, टॉप-N प्रति समूह के लिए आदर्श

विंडो फ़ंक्शन MySQL 8.0 की सबसे शक्तिशाली विश्लेषणात्मक विशेषताओं में से एक हैं।

  1. - MySQL में SELECT क्वेरी से विशिष्ट कॉलम रिकॉर्ड कैसे प्राप्त करें?

    MySQL में किसी टेबल से केवल विशिष्ट कॉलम के डेटा को प्राप्त करना बहुत आसान है। इसके लिए SELECT * के बजाय केवल उस कॉलम का नाम लिखें जिसे आप देखना चाहते हैं। उदाहरण के साथ समझें सबसे पहले एक डेमो टेबल बनाते हैं: mysql> CREATE TABLE DemoTable1837 ( StudentId INT NOT NULL AUTO_INCREMENT PRIMARY

  1. - MySQL में ENUM कॉलम से केवल 'NO' मानों की गणना करें

    MySQL में ENUM कॉलम पर सशर्त गणना के लिए बूलियन अभिव्यक्ति का योग (SUM(condition)) उपयोग कर सकते हैं। MySQL में TRUE = 1 और FALSE = 0 होता है। टेबल बनाएं mysql> CREATE TABLE DemoTable1829 ( Name VARCHAR(20), isTopper ENUM(YES,NO) ); डेटा डालें mysql> INSERT INTO DemoTable1829 VALUES(

  1. - MySQL में GROUP BY HAVING और IN से एकाधिक मान शर्त पूरी करने वाली पंक्तियाँ चुनें

    किसी कॉलम (जैसे Subject) में एकाधिक विशिष्ट मान (MySQL, MongoDB) **दोनों** रखने वाले समूह (FirstName) खोजने के लिए IN फ़िल्टर + GROUP BY + HAVING COUNT(*) = N का उपयोग करें। टेबल बनाएं mysql> CREATE TABLE DemoTable1885 (FirstName VARCHAR(20), Subject VARCHAR(50)); डेटा डालें mysql> INSERT IN

© कॉपीराइट https://in.wsxdn.com सर्वाधिकार सुरक्षित
फ़ंक्शनव्यवहारउदाहरण: 10, 10, 20
ROW_NUMBER()क्रमिक अद्वितीय संख्या1, 2, 3
RANK()टाई = समान रैंक, गैप छोड़ें1, 1, 3
DENSE_RANK()टाई = समान रैंक, गैप नहीं1, 1, 2
NTILE(n)n बकेट में वितरितNTILE(4)