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