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);
विंडो फ्रेम (डिफ़ॉल्ट: UNBOUNDED PRECEDING TO CURRENT ROW)
आमतौर पर ROW_NUMBER के लिए अनावश्यक
अन्य रैंकिंग फ़ंक्शन (MySQL 8.0+)
फ़ंक्शन
व्यवहार
उदाहरण: 10, 10, 20
ROW_NUMBER()
क्रमिक अद्वितीय संख्या
1, 2, 3
RANK()
टाई = समान रैंक, गैप छोड़ें
1, 1, 3
DENSE_RANK()
टाई = समान रैंक, गैप नहीं
1, 1, 2
NTILE(n)
n बकेट में वितरित
NTILE(4)
पार्टिशन द्वारा रैंक (प्रति समूह)
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 की सबसे शक्तिशाली विश्लेषणात्मक विशेषताओं में से एक हैं।
MySQL में किसी टेबल से केवल विशिष्ट कॉलम के डेटा को प्राप्त करना बहुत आसान है। इसके लिए SELECT * के बजाय केवल उस कॉलम का नाम लिखें जिसे आप देखना चाहते हैं।
उदाहरण के साथ समझें
सबसे पहले एक डेमो टेबल बनाते हैं:
mysql> CREATE TABLE DemoTable1837 (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY
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(
किसी कॉलम (जैसे Subject) में एकाधिक विशिष्ट मान (MySQL, MongoDB) **दोनों** रखने वाले समूह (FirstName) खोजने के लिए IN फ़िल्टर + GROUP BY + HAVING COUNT(*) = N का उपयोग करें।
टेबल बनाएं
mysql> CREATE TABLE DemoTable1885 (FirstName VARCHAR(20), Subject VARCHAR(50));
डेटा डालें
mysql> INSERT IN