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

วิธีใช้ MIN() ใน Android SQLite หาค่าต่ำสุด

บทนำ: SQLite Aggregate Function MIN()

MIN() เป็น Aggregate Function หาค่าต่ำสุดของคอลัมน์ ใช้ได้กับตัวเลข วันที่ ข้อความ

ตัวอย่าง: หาเงินเดือนต่ำสุด (MIN Salary)

ขั้นตอนที่ 1-3: โปรเจกต์, Layout, MainActivity

โครงสร้างเดียวกับตัวอย่าง SQLite ก่อนหน้า

ขั้นตอนที่ 4: DatabaseHelper.java - ใช้ MIN()

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        // salary ใช้ TEXT แต่เก็บตัวเลขได้ (SQLite ไม่บังคับ Type)
        db.execSQL("CREATE TABLE " + CONTACTS_TABLE_NAME +
            "(id INTEGER PRIMARY KEY, name TEXT, salary TEXT, datetime DEFAULT CURRENT_TIMESTAMP)");
    } catch (SQLiteException e) {
        try { throw new IOException(e); } 
        catch (IOException e1) { e1.printStackTrace(); }
    }
}

public ArrayList<String> getAllContacts() {
    SQLiteDatabase db = this.getReadableDatabase();
    ArrayList<String> array_list = new ArrayList<>();

    // MIN(salary) หาค่าต่ำสุดของคอลัมน์ salary
    // หมายเหตุ: ไม่มี GROUP BY → คืนค่า 1 แถว เดียวของตารางทั้งหมด
    Cursor res = db.rawQuery(
        "SELECT (id || ' : ' || name || ' : ' || MIN(salary) || ' : ' || datetime) AS fullname " +
        "FROM " + CONTACTS_TABLE_NAME, 
        null
    );

    res.moveToFirst();
    while (!res.isAfterLast()) {
        array_list.add(res.getString(res.getColumnIndex("fullname")));
        res.moveToNext();
    }
    return array_list;
}

คำอธิบาย MIN() ใน SQLite

พฤติกรรมเมื่อไม่มี GROUP BY

  • คืนค่า 1 แถวเดียว ของตารางทั้งหมด
  • คอลัมน์อื่น (id, name, datetime) จะมาจากแถว "แรก" ที่ SQLite อ่านได้ (ไม่ได้รับประกัน)
  • เหมาะสำหรับ: หาค่าต่ำสุดเพียงอย่างเดียว

การใช้กับ GROUP BY (แนะนำ)

-- หาเงินเดือนต่ำสุดของแต่ละคน
SELECT name, MIN(salary) FROM SalaryDetails GROUP BY name;

-- หาเงินเดือนต่ำสุดของแต่ละเดือน
SELECT strftime('%Y-%m', datetime) as month, MIN(salary) 
FROM SalaryDetails GROUP BY month;

ข้อควรระวัง: Salary เก็บเป็น TEXT

ในตัวอย่าง salary เป็น TEXT → MIN() จะเปรียบเทียบแบบ String (Lexicographic)

  • '1000' < '200' = true (เพราะ '1' < '2') → ผิดพลาด!
  • แก้ไข: CAST เป็นตัวเลข MIN(CAST(salary AS REAL)) หรือเก็บเป็น INTEGER/REAL

ตาราง Aggregate Functions ใน SQLite

Functionคำอธิบาย
MIN()ค่าต่ำสุด
MAX()ค่าสูงสุด
AVG()ค่าเฉลี่ย
SUM()ผลรวม
COUNT()นับจำนวนแถว

ผลลัพธ์

ListView แสดง 1 แถว: ข้อมูลพร้อมเงินเดือนต่ำสุดของตารางทั้งหมด