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
Une autre façon d'écrire, qui semble plus logique, mais peut être plus lente (vous devrez tester) est :
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
Avec des dizaines de millions de lignes, chaque requête devient parfois lente, mais avec les index appropriés, c'est aussi rapide que possible. Je pense que vous avez essentiellement besoin d'un index sur Paychecks.EmployeeID et Paychecks.AmountPaid combinés. Et l'index sur Employee.ID peut aider.
Si la jointure vous tue à la fin, vous pouvez exécuter deux requêtes. Le premier utilise uniquement les chèques de paie pour les regrouper par EmployeeID et les ordonner par le max(PaycheckAmount), et un second peut être utilisé pour récupérer les noms de chaque ID. Parfois, les jointures coûtent plus de performances que vous ne le souhaiteriez, et lorsque vous avez 10 millions de chèques de paie pour 500 employés, il peut être plus rapide de le faire en deux étapes, bien que cela signifie qu'ils travaillent dans l'entreprise depuis environ 1600 ans en moyenne. .;-)