sql >> Database teknologi >  >> RDS >> Mysql

Få poster med maks. værdi for hver gruppe af grupperede SQL-resultater

Den korrekte løsning er:

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

Sådan virker det:

Det matcher hver række fra o med alle rækkerne fra b med samme værdi i kolonne Group og en større værdi i kolonne Age . Enhver række fra o ikke har den maksimale værdi af dens gruppe i kolonne Age vil matche en eller flere rækker fra b .

LEFT JOIN får den til at matche den ældste person i gruppen (inklusive de personer, der er alene i deres gruppe) med en række fuld af NULL s fra b ('ingen største alder i gruppen').
Brug af INNER JOIN gør, at disse rækker ikke matcher, og de ignoreres.

WHERE klausul beholder kun rækkerne med NULL s i felterne udtrukket fra b . De er de ældste personer fra hver gruppe.

Yderligere aflæsninger

Denne løsning og mange andre er forklaret i bogen SQL Antipatterns:Avoiding the Pitfalls of Database Programming



  1. Top 30 mest nyttige Concurrent Manager-forespørgsler

  2. Mest effektive T-SQL måde at polstre en varchar til venstre til en vis længde?

  3. Hvordan gemmer man uuid som nummer?

  4. Er det muligt at sende tabelnavn som en parameter i Oracle?