Budete to muset udělat tak, že použijete "hodnost" na okres, pak pouze uchopte za pořadí =1... @Poslední okres v místě připojení je výchozí nula, v případě, že je okres založen na ID. Pokud je okres založen na znacích, můžete jej změnit na ="" místo toho, aby odpovídal datovému typu.
Abychom objasnili, co se děje. Předběžný dotaz "AwardCounts" provede celý dotaz na okres a člena s libovolným počtem ocenění. Poté seřazeno podle okresu a počtu ocenění členů (sestupně), čímž se nejvyšší počet ocenění umístí na první pozici za okres.
To je spojeno s dalším falešným aliasem „SQLVars“, který pouze vytváří vložené proměnné pro dotaz s názvem @RankSeq a @LastDistrict. Takže poprvé v, "DistRankSeq" se stane 1 pro první okres, pak přičte "@LastDistrict" hodnotou okresu. Dalšímu záznamu pro stejný okres (protože bude ve správném pořadí) bude přidělena hodnost 2, pak 3, atd... Když dojde ke změně z jakéhokoli „POSLEDNÍHO“ okresu na nový záznam. testováno, pořadí se nastaví zpět na 1 a začíná znovu. Takže byste mohli mít jeden obvod se 100 členy, další s 5, další se 17...
Takže váš poslední dotaz obsahuje všechny s jejich příslušnými pozicemi... Nyní použijte HAVING the finální okresní pořadí =1... Tímto způsobem můžete také upravit nutnost získat 3 nejlepší členy na okres (např. )...
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
UPRAVIT PODLE ZPĚTNÉ VAZBY Pokud jeho agregace zabírá čas, pak bych udělal následující. Vytvořte novou tabulku, která nebude obsahovat nic jiného než agregace podle okresu, název a počáteční hodnost pro okres. Když je do této tabulky přidán jakýkoli nový záznam, spouštěč pak přidá jeden do celkového počtu v tabulce, poté zkontroluje, kde se tato osoba nachází v jejich okrese, a znovu aktualizuje svou novou pozici v hodnosti. Mohli byste to udělat ještě o krok dále a mít další tabulku pouze „TOP“ členů na okresní tabulku, což je jedna na okres se jménem osoby. Když nový člověk dosáhne nejvyšší pozice, jeho jméno se zapíše do tabulky a přepíše se ten, kdo tam byl jako poslední.