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
Un modo diverso di scrivere, che sembra più logico, ma potrebbe essere più lento (dovresti fare un test) è:
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
Con decine di milioni di righe, ogni query a volte cresce lentamente, ma con gli indici appropriati, questo è il più veloce possibile. Penso che fondamentalmente tu abbia bisogno di un indice su Paychecks.EmployeeID e Paychecks.AmountPaid combinati. E l'indice su Employee.ID può aiutare.
Se il join alla fine ti sta uccidendo, puoi eseguire due query. Il primo utilizza solo le buste paga per raggrupparle per EmployeeID e ordinarle per max(PaycheckAmount) e un secondo può essere utilizzato per recuperare i nomi per ciascun ID. A volte le join costano più prestazioni di quelle che vorresti e quando hai 10 milioni di buste paga per 500 dipendenti, potrebbe essere più veloce farlo in due passaggi, anche se significherà che lavorano nell'azienda da circa 1600 anni in media .;-)