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:terbesar-n-per-grup .
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:
- Kondisi join kedua memiliki nilai sisi kiri lebih kecil dari nilai kanan
- Saat Anda melakukan langkah 1, baris yang benar-benar memiliki nilai maksimal akan memiliki
NULL
di sisi kanan (ini adalahLEFT JOIN
, ingat?). Kemudian, kami memfilter hasil gabungan, hanya menampilkan baris dengan sisi kananNULL
.
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.