สร้างตารางและข้อมูลตัวอย่าง
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()- รวมค่าเป็นสตริง