ใช้ GROUP BY ร่วมกับ MAX() เพื่อรวมแถวที่มี ID ซ้ำกัน และหาค่าสูงสุดของแต่ละคอลัมน์ตัวเลข
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1804 (
Id INT,
Marks1 INT,
Marks2 INT,
Marks3 INT
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล (ID ซ้ำ มีค่า NULL)
mysql> INSERT INTO DemoTable1804 VALUES(1, 56, 89, 34); mysql> INSERT INTO DemoTable1804 VALUES(1, 98, NULL, 94); mysql> INSERT INTO DemoTable1804 VALUES(2, 34, 45, 78); mysql> INSERT INTO DemoTable1804 VALUES(2, NULL, 67, NULL);
3. แสดงข้อมูลเดิม
mysql> SELECT * FROM DemoTable1804; +------+--------+--------+--------+ | Id | Marks1 | Marks2 | Marks3 | +------+--------+--------+--------+ | 1 | 56 | 89 | 34 | | 1 | 98 | NULL | 94 | | 2 | 34 | 45 | 78 | | 2 | NULL | 67 | NULL | +------+--------+--------+--------+
4. Query: GROUP BY Id, หา MAX ของแต่ละคอลัมน์
mysql> SELECT Id, MAX(Marks1), MAX(Marks2), MAX(Marks3)
FROM DemoTable1804
GROUP BY Id;
คำอธิบาย MAX() กับ NULL:
MAX()ข้ามค่า NULL อัตโนมัติ (ไม่นับ NULL)- Id=1: Marks1 → MAX(56, 98) = 98 | Marks2 → MAX(89, NULL) = 89 | Marks3 → MAX(34, 94) = 94
- Id=2: Marks1 → MAX(34, NULL) = 34 | Marks2 → MAX(45, 67) = 67 | Marks3 → MAX(78, NULL) = 78
5. ผลลัพธ์
+------+-------------+-------------+-------------+ | Id | MAX(Marks1) | MAX(Marks2) | MAX(Marks3) | +------+-------------+-------------+-------------+ | 1 | 98 | 89 | 94 | | 2 | 34 | 67 | 78 | +------+-------------+-------------+-------------+
ฟังก์ชันรวม (Aggregate Functions) ที่ข้าม NULL
| ฟังก์ชัน | พฤติกับ NULL |
|---|---|
MAX(), MIN() | ข้าม NULL |
SUM(), AVG() | ข้าม NULL |
COUNT(col) | นับเฉพาะ NOT NULL |
COUNT(*) | นับทุกแถว (รวม NULL) |
สรุป
GROUP BY Id + MAX(col) รวมแถว ID ซ้ำ และหาค่าสูงสุดของแต่ละคอลัมน์ โดยอัตโนมัติข้าม NULL ใช้ได้กับ MIN, SUM, AVG เช่นกัน เหมาะสำหรับ Deduplication และหาค่าสูงสุดต่อกลุ่ม