您必須通過應用每個分區的「排名」來實現,然後只按每個排名抓取= 1 ...在連接位置的@LastDistrict默認爲零,以防該分區基於ID。如果分區是基於字符的,則可以將其更改爲=「」,而不是匹配數據類型。
爲了澄清所發生的事情。 「AwardCounts」預查詢可以爲每個地區和每個成員提供完整的查詢,無論是多少獎勵。然後,按地區和會員獎勵計數(降序)排序,從而將最高獎勵計數定爲每區第一位。
這是連接到另一個虛假別名「SQLVars」,它只是創建內聯變量到名爲@RankSeq和@LastDistrict的查詢。因此,第一次,「DistRankSeq」將成爲第一個地區的1,然後以該地區的價值填滿「@LastDistrict」。同一地區的下一個條目(因爲它將按照適當的順序排列)將被分配爲2,然後3等的等級......當從「最後」地區到新記錄存在變化時測試後,排名重新回到1並重新開始。所以,你可以有一個區100成員,另一個5,另一個17 ...
因此,您的最終查詢已全部與他們各自的隊伍......現在,應用HAVING最後的地區排名= 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
編輯每一次反饋 如果其聚集這就是抽空,然後我會做以下。創建一個新的表格,只包括每個區域的聚合,區域的名稱和初始等級。當任何新記錄被添加到該表中時,觸發器然後將一個新的記錄添加到聚合表計數中,然後檢查該人在他們的區域內的位置並且重新更新其新的等級位置。你可以更進一步,並在每個分區有另一張「TOP」會員表,每個分區有一個人的名字。當一個新人遇到最高職位時,他們的名字被放在桌子上,覆蓋最後一個人。
問題是'Number'是一個派生列,是'count(Award).. GROUP BY Membername,District)''。 – 2012-01-27 03:15:03
這是一個問題? – 2012-01-27 03:20:29
是的,因爲'count'(每個成員名稱都是a.award,distrinct)
2012-01-27 03:28:26