Mendapatkan Maklumat Terkini Menggunakan SQL Group By & Max
Dalam sesetengah senario, adalah perlu untuk mendapatkan semula nilai terbaharu atau maksimum yang dikumpulkan mengikut lajur tertentu dalam set data. Satu pengagregatan biasa adalah untuk mencari maklumat terkini untuk gabungan nilai yang unik.
Pertimbangkan jadual berikut yang mengandungi senarai penggera:
id | name | alarmId | alarmUnit | alarmLevel |
---|---|---|---|---|
1 | test | voltage | psu | warning |
2 | test | voltage | psu | ceasing |
3 | test | voltage | psu | warning |
4 | test | temp | rcc | warning |
5 | test | temp | rcc | ceasing |
Objektifnya adalah untuk mendapatkan hanya yang paling terkini maklumat untuk setiap gabungan alarmId dan alarmUnit. Hasil yang dijangkakan akan muncul seperti berikut:
id | name | alarmId | alarmUnit | alarmLevel |
---|---|---|---|---|
3 | test | voltage | psu | warning |
5 | test | temp | rcc | ceasing |
Beberapa pendekatan boleh digunakan untuk mencapai keputusan ini. Satu kaedah biasa melibatkan penggunaan fungsi ROW_NUMBER(), yang memberikan pangkat kepada setiap baris dalam setiap kumpulan. Pertanyaan berikut mengambil kesempatan daripada fungsi ini:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY alarmId, alarmUnit ORDER BY id DESC) AS rn FROM mytable ) q WHERE rn = 1
Pertanyaan ini mengembalikan baris terbaharu untuk setiap gabungan alarmId dan alarmUnit.
Untuk pangkalan data yang tidak menyokong fungsi ROW_NUMBER() , seperti MySQL, pendekatan berbeza boleh digunakan:
SELECT mi.* FROM ( SELECT alarmId, alarmUnit, MAX(id) AS mid FROM mytable GROUP BY alarmId, alarmUnit ) mo JOIN mytable mi ON mi.id = mo.mid
Pertanyaan ini menggunakan subkueri untuk mengenal pasti id maksimum untuk setiap gabungan alarmId dan alarmUnit, dan kemudian menggabungkan hasil dengan jadual asal untuk mendapatkan semula baris yang sepadan.
Dalam PostgreSQL versi 8.3 dan ke bawah, klausa DISTINCT ON boleh digunakan:
SELECT DISTINCT ON (alarmId, alarmUnit) * FROM mytable ORDER BY alarmId, alarmUnit, id DESC
Pertanyaan ini mengembalikan baris pertama yang berbeza untuk setiap gabungan alarmId dan alarmUnit, yang memberikan maklumat terkini. Dengan memanfaatkan teknik ini, pembangun boleh mendapatkan semula nilai terkini daripada data mereka dengan cekap, membolehkan mereka membuat keputusan termaklum berdasarkan maklumat terkini yang tersedia.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Maklumat Terkini Menggunakan `GROUP BY` dan `MAX` (atau Alternatif) SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!