MySQL में GROUP BY और MAX() का उपयोग करके प्रति समूह अधिकतम मान खोजना
जब आपके पास डुप्लिकेट नाम (या अन्य समूहन कॉलम) हों और आप प्रत्येक समूह के लिए अधिकतम मान खोजना चाहते हैं, तो GROUP BY के साथ MAX() एग्रीगेट फ़ंक्शन का उपयोग करें।
टेबल बनाना
mysql> CREATE TABLE DemoTable1964 (
-> StudentName VARCHAR(20),
-> StudentAge INT
-> );
Query OK, 0 rows affected (0.00 sec)
डुप्लिकेट नामों के साथ डेटा डालना
mysql> INSERT INTO DemoTable1964 VALUES ('Chris', 23);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1964 VALUES ('David', 34);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1964 VALUES ('Chris', 27);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1964 VALUES ('Sam', 31);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1964 VALUES ('David', 32);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO DemoTable1964 VALUES ('David', 37);
Query OK, 1 row affected (0.00 sec)
सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable1964;
+-------------+------------+
| StudentName | StudentAge |
+-------------+------------+
| Chris | 23 |
| David | 34 |
| Chris | 27 |
| Sam | 31 |
| David | 32 |
| David | 37 |
+-------------+------------+
6 rows in set (0.00 sec)
प्रति छात्र अधिकतम आयु प्राप्त करने का क्वेरी
mysql> SELECT StudentName, MAX(StudentAge)
-> FROM DemoTable1964
-> GROUP BY StudentName;
परिणाम
+-------------+-----------------+
| StudentName | max(StudentAge) |
+-------------+-----------------+
| Chris | 27 |
| David | 37 |
| Sam | 31 |
+-------------+-----------------+
3 rows in set (0.00 sec)
व्याख्या
| StudentName | उम्र | अधिकतम |
|---|---|---|
| Chris | 23, 27 | 27 |
| David | 34, 32, 37 | 37 |
| Sam | 31 | 31 |
अधिक जानकारी के साथ विस्तारित क्वेरी
SELECT
StudentName,
COUNT(*) AS RecordCount,
MIN(StudentAge) AS MinAge,
MAX(StudentAge) AS MaxAge,
AVG(StudentAge) AS AvgAge,
SUM(StudentAge) AS TotalAge
FROM DemoTable1964
GROUP BY StudentName
ORDER BY MaxAge DESC;
संबंधित एग्रीगेट फ़ंक्शन
MIN(): न्यूनतम मानMAX(): अधिकतम मानAVG(): औसत मानSUM(): योगCOUNT(): पंक्तियों की गिनतीGROUP_CONCAT(): मानों को स्ट्रिंग में संयोजित
अधिकतम मान वाली पूरी पंक्ति प्राप्त करना (सिर्फ मान नहीं)
-- विधि 1: JOIN के साथ
SELECT d1.* FROM DemoTable1964 d1
JOIN (
SELECT StudentName, MAX(StudentAge) AS MaxAge
FROM DemoTable1964
GROUP BY StudentName
) d2 ON d1.StudentName = d2.StudentName AND d1.StudentAge = d2.MaxAge;
-- विधि 2: विंडो फ़ंक्शन (MySQL 8.0+)
SELECT StudentName, StudentAge FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY StudentName ORDER BY StudentAge DESC) AS rn
FROM DemoTable1964
) t WHERE rn = 1;
सामान्य गलतियाँ
-- गलत: गैर-एग्रीगेट कॉलम SELECT में बिना GROUP BY के
SELECT StudentName, StudentAge, MAX(StudentAge) FROM DemoTable1964 GROUP BY StudentName;
-- MySQL ONLY_FULL_GROUP_BY मोड में त्रुटि देगा
-- सही: सभी गैर-एग्रीगेट कॉलम GROUP BY में होने चाहिए
SELECT StudentName, MAX(StudentAge) FROM DemoTable1964 GROUP BY StudentName;
केस संवेदनशीलता नोट
GROUP BY डिफ़ॉल्ट कॉलेशन के अनुसार केस-असंवेदनशील है। 'Chris' और 'CHRIS' एक साथ समूहित होंगे। केस-संवेदनशील समूहन के लिए:
GROUP BY BINARY StudentName