Du bliver nødt til at gøre det ved at anvende en "rang" pr. distrikt, og derefter kun gribe pr. rang =1... @LastDistrict på tilslutningsstedet er som standard nul, hvis distriktet er baseret på et ID. Hvis distriktet er char-baseret, kan du bare ændre det til ="" i stedet for at matche datatypen.
For at afklare, hvad der sker. "AwardCounts"-forespørgslen udfører hele forespørgslen pr. distrikt og medlem med uanset hvor mange præmieringer der er. Derefter, sorteret efter antal af distrikts- og medlemspræmier (faldende), hvilket placerer det højeste antal præmier på den første position pr. distrikt.
Det er forbundet med et andet falsk alias "SQLVars", som blot opretter inline-variabler til forespørgslen kaldet @RankSeq og @LastDistrict. Så første gang i, vil "DistRankSeq" blive en 1 for det første distrikt, og derefter prime "@LastDistrict" med værdien af distriktet. Den næste post for det samme distrikt (da den vil være i den rigtige rækkefølge) vil blive tildelt rangen 2, derefter 3 osv... Når der er en ændring fra det "SIDSTE" distrikt var til den nye rekord testet, bliver rangeringen sat tilbage til 1 og starter forfra. Så du kunne have et distrikt med 100 medlemmer, et andet med 5, et andet med 17...
Så din endelige forespørgsel har dem alle med deres respektive rækker... Anvend nu HAVE den endelige distriktsrangering =1... Hvis du gør dette, kan du også justere behovet for at få de 3 bedste medlemmer pr. distrikt (f.eks. )...
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
REDIGER PR. FEEDBACK Hvis det er den sammenlægning, der tager tid, så ville jeg gøre følgende. Opret en ny tabel uden andet end aggregeringer pr. distrikt, navn og indledende rang for distriktet. Efterhånden som enhver ny post føjes til denne tabel, føjer triggeren en til det samlede tabelantal, og kontrollerer derefter, hvor denne person er i deres distrikt og opdaterer sin nye rangposition igen. Du kan tage det et skridt videre og have en anden tabel med kun "TOP"-medlem pr. distrikts-tabel, der er en pr. distrikt med personens navn. Når en ny person rammer den øverste position, sættes deres navn i tabellen, og overskriver den, der var der sidst.