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

MySQL: แสดงจำนวนสูงสุด (MAX) จาก ID ที่ซ้ำกันด้วย GROUP BY

สร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable2003 ( CustomerId int, Amount int );
mysql> insert into DemoTable2003 values(101,560);
mysql> insert into DemoTable2003 values(102,1080);
mysql> insert into DemoTable2003 values(101,570);
mysql> insert into DemoTable2003 values(102,870);
mysql> insert into DemoTable2003 values(101,460);

ข้อมูลในตาราง

+------------+--------+
| CustomerId | Amount |
+------------+--------+
| 101        | 560    |
| 102        | 1080   |
| 101        | 570    |
| 102        | 870    |
| 101        | 460    |
+------------+--------+

Query หาค่า Amount สูงสุดต่อ CustomerId

mysql> select CustomerId, max(Amount) from DemoTable2003 group by CustomerId;

ผลลัพธ์

+------------+-------------+
| CustomerId | max(Amount) |
+------------+-------------+
| 101        | 570         |
| 102        | 1080        |
+------------+-------------+

อธิบาย

  • GROUP BY CustomerId จับกลุ่มแถวที่มี CustomerId เดียวกัน
  • MAX(Amount) หาค่าสูงสุดในแต่ละกลุ่ม
  • CustomerId 101: ค่าสูงสุดคือ 570 (จาก 560, 570, 460)
  • CustomerId 102: ค่าสูงสุดคือ 1080 (จาก 1080, 870)

ขยาย: ดึงข้อมูลเพิ่มเติมของแถวที่มีค่าสูงสุด

หากต้องการดูข้อมูลแถวทั้งหมดของค่าสูงสุด (ไม่ใช่แค่ค่า MAX):

-- วิธี 1: JOIN กลับมา (MySQL ทุกเวอร์ชัน)
SELECT t1.* FROM DemoTable2003 t1
JOIN (
    SELECT CustomerId, MAX(Amount) AS max_amt FROM DemoTable2003 GROUP BY CustomerId
) t2 ON t1.CustomerId = t2.CustomerId AND t1.Amount = t2.max_amt;

-- วิธี 2: Window Function (MySQL 8.0+)
SELECT CustomerId, Amount FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY Amount DESC) AS rn
    FROM DemoTable2003
) t WHERE rn = 1;

ฟังก์ชัน Aggregate อื่นที่ใช้กับ GROUP BY

  • MIN() - ค่าต่ำสุด
  • SUM() - ผลรวม
  • AVG() - ค่าเฉลี่ย
  • COUNT() - จำนวนแถว
  • GROUP_CONCAT() - รวมค่าเป็นสตริง