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