Rumah > Soal Jawab > teks badan
P粉6676492532023-08-23 09:25:35
Saya lebih suka menggunakan kod sesedikit mungkin...
Anda boleh menggunakan IN
untuk mencapai
Cuba ini:
SELECT * FROM t1 WHERE (id,rev) IN ( SELECT id, MAX(rev) FROM t1 GROUP BY id )
Pada pendapat saya, ini lebih mudah... lebih mudah dibaca dan diselenggara.
P粉5174756702023-08-23 09:14:22
Anda hanya perlukan GROUP BY
子句中使用MAX
fungsi pengagregatan:
SELECT id, MAX(rev) FROM YourTable GROUP BY id
Saya baru perasan bahawa anda juga memerlukan content
lajur.
Ini adalah masalah yang sangat biasa dalam SQL: cari data lengkap yang sepadan dengan nilai maksimum dalam lajur berdasarkan pengecam kumpulan tertentu. Saya telah banyak mendengar soalan ini dalam kerjaya saya. Malah, saya menjawab salah satu soalan ini semasa temu duga teknikal di tempat kerja saya sekarang.
Soalan ini sebenarnya sangat biasa sehingga komuniti Stack Overflow mencipta teg khusus untuk menangani soalan jenis ini: terhebat-n-per-kumpulan.
Pada asasnya, anda mempunyai dua cara untuk menyelesaikan masalah ini:
group-identifier, max-value-in-group
subqueryDalam pendekatan ini anda mula-mula menemui group-identifier, max-value-in-group
(已经在上面解决了)。然后,你将你的表与子查询进行连接,使用group-identifier
和max-value-in-group
dalam subkueri (sudah diselesaikan di atas). Anda kemudian sertai jadual anda dengan subkueri, menggunakan
max-value-in-group
untuk equijoin: 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
group-identifier
Dalam pendekatan ini, anda melakukan cantuman kiri jadual dengan dirinya sendiri. Equijoin pada
NULL
(记住这是一个LEFT JOIN
)。然后,我们过滤连接结果,只显示右侧为NULL
Apabila anda melakukan langkah 1, baris yang sebenarnya mempunyai nilai terbesar ialah baris dengan Jadi, anda akan mendapat:
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;
Hasil yang diperolehi oleh kedua-dua kaedah ini adalah sama.
group-identifier
和max-value-in-group
Jika anda mempunyai dua baris dengan
maks-nilai-dalam-kumpulan
yang sama, kedua-dua kaedah akan memasukkan kedua-dua baris dalam hasil carian. Kedua-dua kaedah adalah serasi dengan SQL ANSI, jadi tidak kira RDBMS yang anda gunakan, anda boleh menggunakan kedua-dua kaedah tanpa mengira "gaya"nya.
Kedua-dua kaedah adalah sangat cekap, tetapi keputusan khusus mungkin berbeza-beza (RDBMS, struktur pangkalan data, indeks, dll.). Jadi apabila memilih salah satu kaedah ini, lakukan penanda aras
. Dan pastikan anda memilih kaedah yang paling sesuai untuk anda. 🎜