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