Anda harus melakukannya dengan menerapkan "peringkat" per distrik, lalu ambil hanya per peringkat =1... @LastDistrict di lokasi bergabung didefaultkan ke nol, jika distrik didasarkan pada ID. Jika distrik berbasis karakter, Anda dapat mengubahnya menjadi ="" agar sesuai dengan tipe data.
Untuk memperjelas apa yang terjadi. Pra-kueri "AwardCounts" melakukan seluruh kueri per distrik dan anggota dengan berapa pun jumlah penghargaan. Kemudian, diurutkan berdasarkan distrik dan jumlah penghargaan anggota (menurun), sehingga menempatkan jumlah penghargaan tertinggi di posisi pertama per distrik.
Itu bergabung dengan alias palsu lain "SQLVars" yang hanya membuat variabel sebaris ke kueri yang disebut @RankSeq dan @LastDistrict. Jadi, pertama kali masuk, "DistRankSeq" akan menjadi 1 untuk distrik pertama, lalu prima "@LastDistrict" dengan nilai distriknya. Entri berikutnya untuk distrik yang sama (karena akan berada dalam urutan urutan yang benar) akan diberi peringkat 2, lalu 3, dll... Ketika ada perubahan dari apa pun Distrik "TERAKHIR" ke rekor baru menjadi diuji, peringkat akan diatur kembali ke 1 dan mulai dari awal lagi. Jadi Anda bisa memiliki satu distrik dengan 100 anggota, yang lain dengan 5, yang lain dengan 17...
Jadi, kueri terakhir Anda memiliki semuanya dengan peringkat masing-masing... Sekarang, terapkan HAVING the final district rank =1... Dengan melakukan ini, Anda juga dapat menyesuaikan keharusan untuk mendapatkan 3 anggota teratas per distrik (misalnya )...
select
AwardCounts.District,
AwardCounts.MemberName,
AwardCounts.memberAwards,
@RankSeq := if( @LastDistrict = AwardCounts.District, @RankSeq +1, 1 ) DistRankSeq,
@LastDistrict := AwardCounts.District as ignoreIt
from
( select
a.district,
a.membername,
count(*) as memberAwards
from
Awards a
group by
a.district,
a.membername
order by
a.district,
memberAwards desc ) AwardCounts
JOIN (select @RankSeq := 0, @LastDistrict = 0 ) SQLVars
HAVING
DistRankSeq = 1
EDIT PER UMPAN BALIK Jika agregasinya memakan waktu, maka saya akan melakukan hal berikut. Buat tabel baru dengan hanya agregasi per distrik, nama, dan peringkat awal untuk distrik. Saat setiap catatan baru ditambahkan ke tabel ini, pemicu kemudian menambahkan satu ke jumlah tabel agregat, lalu memeriksa di mana orang itu berada dalam distrik mereka dan memperbarui kembali posisi peringkat barunya. Anda dapat melangkah lebih jauh dan memiliki tabel lain yang hanya berisi anggota "TOP" per tabel distrik yaitu satu tabel per distrik dengan nama orang tersebut. Ketika orang baru mencapai posisi teratas, nama mereka dimasukkan ke dalam tabel, menimpa siapa pun yang terakhir berada di sana.