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
Cara penulisan yang berbeda, yang terlihat lebih logis, tetapi mungkin lebih lambat (Anda harus mengujinya) adalah:
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
Dengan puluhan juta baris, setiap kueri terkadang tumbuh lambat, tetapi dengan indeks yang tepat, ini secepat yang didapat. Saya pikir Anda pada dasarnya membutuhkan satu indeks di Paychecks.EmployeeID dan Paychecks.AmountPaid digabungkan. Dan indeks pada Employee.ID dapat membantu.
Jika bergabung pada akhirnya membunuh Anda, Anda dapat menjalankan dua kueri. Yang pertama hanya menggunakan cek gaji untuk mengelompokkannya berdasarkan EmployeeID dan mengurutkannya berdasarkan max(PaycheckAmount), dan yang kedua dapat digunakan untuk mengambil nama untuk setiap ID. Terkadang bergabung membutuhkan kinerja yang lebih tinggi daripada yang Anda inginkan, dan ketika Anda mendapatkan 10 juta gaji untuk 500 karyawan, mungkin lebih cepat melakukannya dalam dua langkah, meskipun itu berarti mereka telah bekerja di perusahaan selama rata-rata 1600 tahun. .;-)