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

เลือกค่าต่ำสุดจากคอลัมน์พร้อมค่าซ้ำในคอลัมน์อื่น MySQL

การเตรียมข้อมูล

mysql> CREATE TABLE DemoTable1875 (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Class VARCHAR(20),
    Amount INT
);

mysql> INSERT INTO DemoTable1875(Class, Amount) VALUES
    ('X', 750), ('X', 140), ('X', 450),
    ('Y', 6780),
    ('Z', 1350), ('Z', 2050);

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

+----+-------+--------+
| Id | Class | Amount |
+----+-------+--------+
|  1 | X     |    750 |
|  2 | X     |    140 |
|  3 | X     |    450 |
|  4 | Y     |   6780 |
|  5 | Z     |   1350 |
|  6 | Z     |   2050 |
+----+-------+--------+

หาค่า Amount ต่ำสุดแต่ละ Class

mysql> SELECT Class, MIN(Amount) FROM DemoTable1875 GROUP BY Class;

ผลลัพธ์:

+-------+-------------+
| Class | Min(Amount) |
+-------+-------------+
| X     |         140 |
| Y     |        6780 |
| Z     |        1350 |
+-------+-------------+

ขยาย: ดูรายละเอียดแถวที่มีค่าต่ำสุด

-- MySQL 8.0+ ใช้ Window Function
SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Class ORDER BY Amount) AS rn
    FROM DemoTable1875
) t WHERE rn = 1;

-- Version เก่า: Self Join
SELECT t1.* FROM DemoTable1875 t1
JOIN (
    SELECT Class, MIN(Amount) AS min_amt FROM DemoTable1875 GROUP BY Class
) t2 ON t1.Class = t2.Class AND t1.Amount = t2.min_amt;

ฟังก์ชัน Aggregate อื่นๆ

GROUP BY กับคอลัมน์อื่น

MySQL (ONLY_FULL_GROUP_BY=OFF) อนุญาต Select คอลัมน์ที่ไม่ได้อยู่ใน GROUP BY แต่ควรระวังผลลัพธ์ไม่แน่นอน

ฟังก์ชันคำอธิบาย
MIN()ค่าต่ำสุด
MAX()ค่าสูงสุด
AVG()ค่าเฉลี่ย
SUM()ผลรวม
COUNT()จำนวนแถว
GROUP_CONCAT()รวมค่าเป็น String