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