Hay una manera súper simple de hacer esto en mysql:
select *
from (select * from mytable order by `Group`, age desc, Person) x
group by `Group`
Esto funciona porque en mysql se le permite no agregar columnas que no sean de grupo, en cuyo caso mysql solo devuelve la primera fila. La solución es primero ordenar los datos de manera que para cada grupo la fila que desee sea primero, luego agrupe por las columnas para las que desea el valor.
Evita las subconsultas complicadas que intentan encontrar el max()
etc., y también los problemas de devolver varias filas cuando hay más de una con el mismo valor máximo (como lo harían las otras respuestas)
Nota: Esta es una solución solo para mysql . Todas las demás bases de datos que conozco arrojarán un error de sintaxis SQL con el mensaje "las columnas no agregadas no se enumeran en el grupo por cláusula" o similar. Debido a que esta solución utiliza un comportamiento indocumentado , los más cautelosos pueden incluir una prueba para afirmar que sigue funcionando si una versión futura de MySQL cambia este comportamiento.
Actualización de la versión 5.7:
Desde la versión 5.7, la sql-mode
configuración incluye ONLY_FULL_GROUP_BY
por defecto, por lo que para que esto funcione se debe no tener esta opción (editar el archivo de opciones del servidor para eliminar esta configuración).