地区ごとに「ランク」を適用する必要があります。その後、ランクごとにグラブするだけです=1 ...地区がIDに基づいている場合、結合位置の@LastDistrictはデフォルトでゼロになります。地区が文字ベースの場合は、データ型に一致するように、代わりに=""に変更できます。
何が起こっているのかを明確にするため。 「AwardCounts」事前クエリは、地区およびメンバーごとにクエリ全体を実行しますが、アワード数は多くなります。次に、地区およびメンバーの賞の数(降順)で並べ替えて、地区ごとの最初の位置に最高の賞の数を配置します。
これは、@RankSeqおよび@LastDistrictと呼ばれるクエリへのインライン変数を作成するだけの別の偽のエイリアス「SQLVars」に結合されます。したがって、最初に、「DistRankSeq」は最初の地区の1になり、次に「@LastDistrict」に地区の値をプライミングします。同じ地区の次のエントリ(適切な順序になるため)には、ランク2、次に3などが割り当てられます...「最後の」地区から新しいレコードに変更があった場合テストすると、ランクは1に戻され、最初からやり直します。つまり、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
フィードバックごとに編集 時間がかかる集計の場合は、次のようにします。地区ごとの集計、名前、および地区の初期ランクのみを含む新しいテーブルを作成します。このテーブルに新しいレコードが追加されると、トリガーはテーブルの集計カウントに1を追加し、その人が地区内のどこにいるかを確認して、新しいランクの位置を再更新します。さらに一歩進んで、地区ごとに「TOP」メンバーだけの別のテーブルを作成することもできます。これは、地区ごとに1つで、その人の名前が付いています。新しい人がトップの位置に当たると、その名前がテーブルに入れられ、最後にいた人が上書きされます。