Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL pilih hanya baris dengan nilai maksimal pada kolom

Sekilas...

Yang Anda butuhkan hanyalah GROUP BY klausa dengan MAX fungsi agregat:

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

Tidak pernah sesederhana itu, bukan?

Saya baru menyadari bahwa Anda memerlukan content kolom juga.

Ini adalah pertanyaan yang sangat umum dalam SQL:temukan seluruh data untuk baris dengan beberapa nilai maksimal dalam kolom per beberapa pengidentifikasi grup. Saya sering mendengar itu selama karir saya. Sebenarnya, itu adalah salah satu pertanyaan yang saya jawab dalam wawancara teknis pekerjaan saya saat ini.

Sebenarnya, sangat umum bahwa komunitas Stack Overflow telah membuat satu tag hanya untuk menangani pertanyaan seperti itu: .

Pada dasarnya, Anda memiliki dua pendekatan untuk memecahkan masalah itu:

Bergabung dengan group-identifier, max-value-in-group simple Sub-kueri

Dalam pendekatan ini, pertama-tama Anda menemukan group-identifier, max-value-in-group (sudah diselesaikan di atas) dalam sub-kueri. Kemudian Anda menggabungkan tabel Anda ke sub-kueri dengan kesetaraan pada kedua group-identifier dan max-value-in-group :

SELECT a.id, a.rev, a.contents
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) rev
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev

Kiri Bergabung dengan diri sendiri, mengubah kondisi dan filter bergabung

Dalam pendekatan ini, Anda pergi bergabung dengan tabel itu sendiri. Kesetaraan ada di group-identifier . Lalu, 2 gerakan cerdas:

  1. Kondisi join kedua memiliki nilai sisi kiri lebih kecil dari nilai kanan
  2. Saat Anda melakukan langkah 1, baris yang benar-benar memiliki nilai maksimal akan memiliki NULL di sisi kanan (ini adalah LEFT JOIN , ingat?). Kemudian, kami memfilter hasil gabungan, hanya menampilkan baris dengan sisi kanan NULL .

Jadi Anda berakhir dengan:

SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
    ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;

Kesimpulan

Kedua pendekatan membawa hasil yang sama persis.

Jika Anda memiliki dua baris dengan max-value-in-group untuk group-identifier , kedua baris akan menjadi hasil di kedua pendekatan.

Kedua pendekatan tersebut kompatibel dengan SQL ANSI, oleh karena itu, akan bekerja dengan RDBMS favorit Anda, apa pun "rasanya".

Kedua pendekatan juga ramah kinerja, namun jarak tempuh Anda mungkin berbeda (RDBMS, Struktur DB, Indeks, dll.). Jadi, ketika Anda memilih satu pendekatan di atas yang lain, benchmark . Dan pastikan Anda memilih salah satu yang paling masuk akal bagi Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Impor Data dari Excel Spreadsheet atau CVS ke MySQL

  2. Bisakah pemicu MySQL mensimulasikan batasan CHECK?

  3. MySQL match() against() - urutkan berdasarkan relevansi dan kolom?

  4. Bagaimana cara mengurangi jam dari datetime di MySQL?

  5. Membangun Sistem Newsletter Dengan PHP dan MySQL