Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีรวมแถวที่ ID เดียวกัน และแสดงค่าสูงสุดของคอลัมน์อื่นใน MySQL

การรวมแถว (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 อื่นที่ใช้ได้

กรณีต้องการ "ค่าล่าสุด" (Latest) ไม่ใช่ Max

หากมี Timestamp ใช้:

SELECT Id,
       MAX(CASE WHEN rn = 1 THEN Value1 END) AS Value1,
       ...
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY CreatedAt DESC) AS rn
    FROM DemoTable
) t
GROUP BY Id;

ต้องใช้ MySQL 8.0+ (Window Functions)

ประสิทธิภาพ

  • Index บน Id ช่วย GROUP BY เร็วขึ้น
  • Composite Index (Id, Value1, Value2...) ช่วย Covering Index
ฟังก์ชันใช้เมื่อ
MAX()ต้องการค่าสูงสุด
MIN()ต้องการค่าต่ำสุด
SUM()ต้องการผลรวม
AVG()ต้องการค่าเฉลี่ย
COUNT()ต้องการจำนวน
GROUP_CONCAT()ต้องการรวมค่าเป็น String