Ще трябва да го направите, като приложите "ранг" за дистрикт, след което само вземете за ранг =1... @LastDistrict на мястото на присъединяване е зададено на нула по подразбиране, в случай че районът се основава на идентификатор. Ако районът е базиран на символи, можете просто да го промените на ="" вместо това, за да съответства на типа данни.
За да се изясни какво се случва. Предварителната заявка "AwardCounts" изпълнява цялата заявка за дистрикт и член с колкото и награди да се броят. След това, подредено по дистрикт и брой награди на членове (надолу), като по този начин най-високият брой награди се поставя на първа позиция за дистрикт.
Това е свързано с друг фалшив псевдоним "SQLVars", който просто създава вградени променливи към заявката, наречена @RankSeq и @LastDistrict. Така че, първият път в, "DistRankSeq" ще стане 1 за първия дистрикт, след което ще зареди "@LastDistrict" със стойността на дистрикта. Следващият запис за същия дистрикт (тъй като ще бъде в правилен ред) ще получи ранг от 2, след това 3 и т.н.... Когато има промяна от какъвто и да е бил "ПОСЛЕДНИЯТ" дистрикт към новия запис се тестван, рангът се връща на 1 и започва отново. Така че можете да имате един дистрикт със 100 членове, друг с 5, друг със 17...
Така че, вашата последна заявка има всички от тях със съответните им рангове... Сега приложете ИМАЩ крайния ранг на дистрикта =1... Правейки това, можете също да коригирате необходимостта да получите първите 3 членове на дистрикт (например )...
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
РЕДАКТИРАНЕ НА ОТЗИВ Ако агрегирането отнема време, тогава бих направил следното. Създайте нова таблица с нищо освен агрегирания по район, име и начален ранг за дистрикта. Тъй като всеки нов запис се добавя към тази таблица, тригерът след това добавя един към общия брой на таблицата, след което проверява къде се намира този човек в техния район и актуализира отново новата си позиция в ранг. Бихте могли да направите още една крачка напред и да имате друга маса само с "ТОП" член на маса на дистрикт, която е по една на дистрикт с името на лицето. Когато нов човек достигне горната позиция, името му се поставя в таблицата, като се презаписва кой е бил там последен.