A solução correta é:
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
Como funciona:
Ele corresponde a cada linha de
o
com todas as linhas de b
tendo o mesmo valor na coluna Group
e um valor maior na coluna Age
. Qualquer linha de o
não ter o valor máximo de seu grupo na coluna Age
corresponderá a uma ou mais linhas de b
. O
LEFT JOIN
faz com que corresponda à pessoa mais velha do grupo (incluindo as pessoas que estão sozinhas em seu grupo) com uma linha cheia de NULL
s de b
('nenhuma idade maior no grupo').Usando
INNER JOIN
faz com que essas linhas não correspondam e sejam ignoradas. O
WHERE
cláusula mantém apenas as linhas com NULL
s nos campos extraídos de b
. São as pessoas mais velhas de cada grupo. Mais leituras
Esta solução e muitas outras são explicadas no livro SQL Antipatterns:Avoiding the Pitfalls of Database Programming