Solusi yang benar adalah:
SELECT o.*
FROM `Persons` o # 'o' from 'oldest person in group'
LEFT JOIN `Persons` b # 'b' from 'bigger age'
ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL # bigger age not found
Cara kerjanya:
Ini cocok dengan setiap baris dari o
dengan semua baris dari b
memiliki nilai yang sama di kolom Group
dan nilai yang lebih besar di kolom Age
. Setiap baris dari o
tidak memiliki nilai maksimum grupnya di kolom Age
akan cocok dengan satu atau beberapa baris dari b
.
LEFT JOIN
membuatnya cocok dengan orang tertua dalam grup (termasuk orang-orang yang sendirian di grup mereka) dengan baris penuh NULL
s dari b
('tidak ada usia terbesar dalam grup').
Menggunakan INNER JOIN
membuat baris ini tidak cocok dan diabaikan.
WHERE
klausa hanya menyimpan baris yang memiliki NULL
s di bidang yang diekstraksi dari b
. Mereka adalah orang-orang tertua dari setiap kelompok.
Bacaan lebih lanjut
Solusi ini dan banyak lainnya dijelaskan dalam buku SQL Antipatterns:Menghindari Perangkap Pemrograman Basis Data