การรวมแถว (Merge Rows) ที่ ID เหมือนกัน และหาค่าสูงสุดด้วย MAX() และ GROUP BY
เมื่อมีหลายแถวที่ ID เดียวกัน แต่คอลัมน์อื่นกระจายอยู่ในแถวต่างกัน ให้ใช้ GROUP BY Id ร่วมกับ MAX() เพื่อรวมเป็น 1 แถวต่อ ID
ตัวอย่าง: รวมแถว Id=100 ที่กระจายอยู่ 3 แถว
1. สร้างตารางและเพิ่มข้อมูล (ข้อมูลกระจาย)
CREATE TABLE DemoTable (
Id INT,
Value1 INT, Value2 INT, Value3 INT, Value4 INT
);
INSERT INTO DemoTable (Id, Value4) VALUES (100, 30);
INSERT INTO DemoTable (Id, Value1, Value2, Value3) VALUES (100, 20, 60, 40);
INSERT INTO DemoTable (Id, Value2, Value3, Value4) VALUES (100, 90, 100, 110);
2. ดูข้อมูลก่อนรวม (3 แถว Id=100)
SELECT * FROM DemoTable;
ผลลัพธ์:
+------+--------+--------+--------+--------+
| Id | Value1 | Value2 | Value3 | Value4 |
+------+--------+--------+--------+--------+
| 100 | NULL | NULL | NULL | 30 |
| 100 | 20 | 60 | 40 | NULL |
| 100 | NULL | 90 | 100 | 110 |
+------+--------+--------+--------+--------+
3. รวมแถว และหาค่าสูงสุดของแต่ละคอลัมน์
SELECT
Id,
MAX(Value1) AS Value1,
MAX(Value2) AS Value2,
MAX(Value3) AS Value3,
MAX(Value4) AS Value4
FROM DemoTable
GROUP BY Id;
ผลลัพธ์:
+------+--------+--------+--------+--------+
| Id | Value1 | Value2 | Value3 | Value4 |
+------+--------+--------+--------+--------+
| 100 | 20 | 90 | 100 | 110 |
+------+--------+--------+--------+--------+
การทำงาน
GROUP BY Idจัดกลุ่มแถวที่ Id เหมือนกันMAX(Value1)หาค่าสูงสุดในกลุ่ม (ข้าม NULL อัตโนมัติ)- ผลลัพธ์: 1 แถวต่อ 1 Id พร้อมค่าสูงสุดของแต่ละคอลัมน์
ฟังก์ชัน Aggregate อื่นที่ใช้ได้
| ฟังก์ชัน | ใช้เมื่อ |
|---|---|
MAX() | ต้องการค่าสูงสุด |
MIN() | ต้องการค่าต่ำสุด |
SUM() | ต้องการผลรวม |
AVG() | ต้องการค่าเฉลี่ย |
COUNT() | ต้องการจำนวน |
GROUP_CONCAT() | ต้องการรวมค่าเป็น String |