MySQL में GROUP BY HAVING MAX के साथ डुप्लिकेट हटाना
डुप्लिकेट पंक्तियों (समान कुंजी कॉलम) को हटाने और केवल अधिकतम मान वाली पंक्ति रखने के लिए, कुंजी कॉलम द्वारा GROUP BY के साथ HAVING MAX() का उपयोग करें।
उदाहरण: डुप्लिकेट कर्मचारी रिकॉर्ड, अधिकतम आयु रखें
mysql> CREATE TABLE DemoTable1468 (
-> Id INT,
-> Name VARCHAR(20),
-> Age INT
-> );
Query OK, 0 rows affected (1.21 sec)
mysql> INSERT INTO DemoTable1468 VALUES
-> (100, 'Chris', 23), (101, 'Bob', 25), (102, 'David', 30),
-> (100, 'Chris', 23), (100, 'Chris', 38), (101, 'Bob', 23);
Query OK, 6 rows affected (0.19 sec)
mysql> SELECT * FROM DemoTable1468;
+------+-------+------+
| Id | Name | Age |
+------+-------+------+
| 100 | Chris | 23 |
| 101 | Bob | 25 |
| 102 | David | 30 |
| 100 | Chris | 23 |
| 100 | Chris | 38 |
| 101 | Bob | 23 |
+------+-------+------+
6 rows in set (0.00 sec)
GROUP BY HAVING MAX क्वेरी
mysql> SELECT Id, Name, Age FROM DemoTable1468
-> GROUP BY Name, Id
-> HAVING MAX(Age);
परिणाम
+------+-------+------+ | Id | Name | Age | +------+-------+------+ | 100 | Chris | 23 | | 101 | Bob | 25 | | 102 | David | 30 | +------+-------+------+ 3 rows in set (0.00 sec)
⚠️ महत्वपूर्ण सीमा
- MySQL
sql_mode=ONLY_FULL_GROUP_BY(डिफ़ॉल्ट 5.7+) के साथ, यह क्वेरी त्रुटि देगी - बिना ONLY_FULL_GROUP_BY के, यह प्रत्येक समूह के लिए मनमाना पंक्ति लौटाता है (पहली मिली)
- उपरोक्त परिणाम में Chris की आयु 23 दिखाई गई है, 38 नहीं!
सही दृष्टिकोण: अधिकतम मान वाली पंक्ति प्राप्त करें
विधि 1: JOIN के साथ सबक्वेरी (सभी संस्करण)
SELECT t1.Id, t1.Name, t1.Age
FROM DemoTable1468 t1
JOIN (
SELECT Id, Name, MAX(Age) AS MaxAge
FROM DemoTable1468
GROUP BY Id, Name
) t2 ON t1.Id = t2.Id AND t1.Name = t2.Name AND t1.Age = t2.MaxAge;
विधि 2: ROW_NUMBER() विंडो फ़ंक्शन (MySQL 8.0+)
SELECT Id, Name, Age
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Id, Name ORDER BY Age DESC) AS rn
FROM DemoTable1468
) t
WHERE rn = 1;
विधि 3: DELETE डुप्लिकेट (अधिकतम रखें)
DELETE t1 FROM DemoTable1468 t1 JOIN DemoTable1468 t2 ON t1.Id = t2.Id AND t1.Name = t2.Name AND t1.Age < t2.Age;