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
Ett annat sätt att skriva, som ser mer logiskt ut, men som kan vara långsammare (du måste testa) är:
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
Med tiotals miljoner rader växer varje fråga långsamt ibland, men med rätt index går det så snabbt som möjligt. Jag tror att du i princip behöver ett index på Paychecks.EmployeeID och Paychecks.AmountPaid tillsammans. Och index på Employee.ID kan hjälpa.
Om joinen dödar dig i slutändan kan du köra två frågor. Den första använder bara lönecheckarna för att gruppera dem efter EmployeeID och beställa dem efter max(PaycheckAmount), och en andra kan användas för att hämta namnen för varje ID. Ibland kostar anslutningar mer prestation än du skulle vilja, och när du fick 10 miljoner lönecheckar för 500 anställda kan det gå snabbare att göra det i två steg, även om det kommer att innebära att de har arbetat på företaget i i genomsnitt cirka 1600 år .;-)