Správné řešení je:
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
Jak to funguje:
Odpovídá každému řádku z o se všemi řádky z b se stejnou hodnotou ve sloupci Group a větší hodnotu ve sloupci Age . Libovolný řádek z o nemá maximální hodnotu své skupiny ve sloupci Age bude odpovídat jednomu nebo více řádkům z b .
LEFT JOIN způsobí, že nejstarší osoba ve skupině (včetně osob, které jsou ve své skupině osamocené) odpovídá řádku plnému NULL s z b ('žádný největší věk ve skupině').
Pomocí INNER JOIN způsobí, že se tyto řádky neshodují a budou ignorovány.
WHERE klauzule zachovává pouze řádky s NULL s v polích extrahovaných z b . Jsou to nejstarší osoby z každé skupiny.
Další čtení
Toto řešení a mnoho dalších jsou vysvětleny v knize SQL Antipatterns:Avoiding the Pitfalls of Database Programming