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
Различен начин на писане, който изглежда по-логичен, но може да е по-бавен (трябва да тествате) е:
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
С десетки милиони редове всяка заявка понякога нараства бавно, но с подходящите индекси това е толкова бързо, колкото става. Мисля, че основно се нуждаете от един индекс на Paychecks.EmployeeID и Paychecks.AmountPaid, комбинирани. И индексът на Employee.ID може да помогне.
Ако присъединяването ви убива в крайна сметка, можете да изпълните две заявки. Първият използва само чековете за заплати, за да ги групира по EmployeeID и да ги подреди по max(PaycheckAmount), а вторият може да се използва за извличане на имената за всеки ID. Понякога присъединяванията струват повече производителност, отколкото бихте искали, и когато получите 10 милиона заплати за 500 служители, може да е по-бързо да го направите в две стъпки, въпреки че това ще означава, че те работят в компанията средно от около 1600 години .;-)