Musisz to zrobić, stosując „rangę” na dzielnicę, a następnie pobieraj tylko za rangę =1... @LastDistrict w lokalizacji przyłączenia jest domyślnie zerowe, w przypadku gdy dzielnica jest oparta na identyfikatorze. Jeśli okręg jest oparty na znakach, możesz po prostu zmienić go na =„”, aby dopasować typ danych.
Aby wyjaśnić, co się dzieje. Zapytanie wstępne „AwardCounts” wykonuje całe zapytanie dla dystryktu i członka z dowolną liczbą nagród. Następnie, uporządkowane według okręgu i liczby nagród dla członków (malejąco), umieszczając w ten sposób najwyższą liczbę nagród na pierwszej pozycji w okręgu.
Jest to połączone z innym fałszywym aliasem „SQLVars”, który po prostu tworzy zmienne wbudowane do zapytania o nazwie @RankSeq i @LastDistrict. Tak więc za pierwszym razem „DistRankSeq” zmieni się na 1 dla pierwszej dzielnicy, a następnie wpisz „@LastDistrict” wartością tej dzielnicy. Następny wpis dla tego samego okręgu (ponieważ będzie w odpowiedniej kolejności) otrzyma rangę 2, potem 3, itd... Gdy nastąpi zmiana z tego, co był w "OSTATNIM" Okręgu, na nowy rekord testowane, ranga zostaje cofnięta do 1 i zaczyna się od nowa. Więc możesz mieć jeden okręg ze 100 członkami, inny z 5, inny z 17...
Tak więc, twoje ostatnie zapytanie zawiera je wszystkie z odpowiednimi rangami... Teraz zastosuj MIEJĄC ostateczną rangę okręgu =1... W ten sposób możesz również dostosować konieczność uzyskania 3 najlepszych członków na dzielnicę (na przykład )...
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
EDYTUJ NA OPINIE Jeśli agregacja zajmuje trochę czasu, zrobiłbym to, co następuje. Utwórz nową tabelę zawierającą wyłącznie agregacje dla okręgu, nazwę i początkową rangę okręgu. Gdy do tej tabeli dodawany jest nowy rekord, wyzwalacz dodaje jeden do łącznej liczby tabel, a następnie sprawdza, gdzie dana osoba znajduje się w swoim okręgu, i ponownie aktualizuje swoją nową pozycję w rankingu. Możesz pójść o krok dalej i mieć kolejny stół z „TOP” członkiem na tabelę okręgu, czyli po jednym na okręg z imieniem i nazwiskiem osoby. Kiedy nowa osoba osiąga najwyższą pozycję, jej imię jest umieszczane w tabeli, zastępując ostatniego.