sql >> Base de Datos >  >> RDS >> Mysql

Obtenga registros con valor máximo para cada grupo de resultados de SQL agrupados

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