select
p.ID,
e.NAME
from
Paychecks p
inner join Employee e on p.EmployeeID = e.ID
group by
p.ID
order by
max(p.AmountPaid) desc
Jiný způsob zápisu, který vypadá logičtěji, ale může být pomalejší (budete muset vyzkoušet), je:
select
e.ID,
e.NAME
from
Employee e
inner join Paychecks p on p.EmployeeID = e.ID
group by
e.ID
order by
max(p.AmountPaid) desc
S desítkami milionů řádků každý dotaz někdy roste pomalu, ale se správnými indexy je to tak rychlé, jak jen to jde. Myslím, že v podstatě potřebujete jeden index na Paychecks.EmployeeID a Paychecks.AmountPaid dohromady. A index na Employee.ID může pomoci.
Pokud vás spojení nakonec zabije, můžete provést dva dotazy. První používá pouze výplaty k jejich seskupení podle EmployeeID a seřazení podle max(PaycheckAmount) a druhý může být použit k načtení jmen pro každé ID. Někdy spojení stojí více výkonu, než byste chtěli, a když dostanete 10 milionů výplat pro 500 zaměstnanců, může být rychlejší to udělat ve dvou krocích, i když to bude znamenat, že ve společnosti pracují v průměru asi 1600 let. .;-)