Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rufen Sie Datensätze mit dem Höchstwert für jede Gruppe von gruppierten SQL-Ergebnissen ab

Die richtige Lösung ist:

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

Wie es funktioniert:

Es stimmt mit jeder Zeile von o überein mit allen Zeilen von b mit dem gleichen Wert in der Spalte Group und einen größeren Wert in der Spalte Age . Jede Zeile von o nicht den Höchstwert seiner Gruppe in der Spalte Age hat stimmt mit einer oder mehreren Zeilen von b überein .

Der LEFT JOIN lässt es die älteste Person in der Gruppe (einschließlich der Personen, die allein in ihrer Gruppe sind) mit einer Reihe voller NULL abgleichen s von b ('kein höchstes Alter in der Gruppe').
Mit INNER JOIN bewirkt, dass diese Zeilen nicht übereinstimmen und ignoriert werden.

Das WHERE -Klausel behält nur die Zeilen mit NULL s in den aus b extrahierten Feldern . Sie sind die ältesten Personen aus jeder Gruppe.

Weiterführende Literatur

Diese Lösung und viele andere werden im Buch SQL Antipatterns:Avoiding the Pitfalls of Database Programming erklärt