La solución correcta es:
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
Cómo funciona:
Coincide con cada fila desde o
con todas las filas desde b
teniendo el mismo valor en la columna Group
y un valor mayor en la columna Age
. Cualquier fila desde o
no tener el valor máximo de su grupo en la columna Age
coincidirá con una o más filas de b
.
El LEFT JOIN
hace que coincida con la persona más antigua del grupo (incluidas las personas que están solas en su grupo) con una fila llena de NULL
s de b
('sin mayor edad en el grupo').
Uso de INNER JOIN
hace que estas filas no coincidan y se ignoran.
El WHERE
cláusula mantiene sólo las filas que tienen NULL
s en los campos extraídos de b
. Son las personas más viejas de cada grupo.
Lecturas adicionales
Esta solución y muchas otras se explican en el libro Antipatrones SQL:Cómo evitar las trampas de la programación de bases de datos