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
Inny sposób pisania, który wygląda bardziej logicznie, ale może być wolniejszy (trzeba przetestować) to:
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
Z dziesiątkami milionów wierszy każde zapytanie czasami rośnie wolno, ale przy odpowiednich indeksach jest to tak szybkie, jak to tylko możliwe. Myślę, że w zasadzie potrzebujesz jednego indeksu na Paychecks.EmployeeID i Paychecks.AmountPaid łącznie. I indeks na Employee.ID może pomóc.
Jeśli złączenie cię w końcu zabija, możesz wykonać dwa zapytania. Pierwszy z nich wykorzystuje tylko czeki do grupowania ich według EmployeeID i porządkowania według max(PaycheckAmount), a drugi może służyć do pobierania nazw dla każdego identyfikatora. Czasami połączenia kosztują więcej wydajności, niż byś chciał, a kiedy masz 10 milionów wypłat dla 500 pracowników, szybciej może być zrobienie tego w dwóch krokach, chociaż będzie to oznaczać, że pracują w firmie średnio około 1600 lat .;-)