Den korrekte løsning er:
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
Sådan virker det:
Det matcher hver række fra o med alle rækkerne fra b med samme værdi i kolonne Group og en større værdi i kolonne Age . Enhver række fra o ikke har den maksimale værdi af dens gruppe i kolonne Age vil matche en eller flere rækker fra b .
LEFT JOIN får den til at matche den ældste person i gruppen (inklusive de personer, der er alene i deres gruppe) med en række fuld af NULL s fra b ('ingen største alder i gruppen').
Brug af INNER JOIN gør, at disse rækker ikke matcher, og de ignoreres.
WHERE klausul beholder kun rækkerne med NULL s i felterne udtrukket fra b . De er de ældste personer fra hver gruppe.
Yderligere aflæsninger
Denne løsning og mange andre er forklaret i bogen SQL Antipatterns:Avoiding the Pitfalls of Database Programming