2012-11-07 7 views
6

これまでの投稿の回答を見ましたが、うまくいきますが、小さなジレンマがあります。 同じシナリオを取る:SQLの計算モード


クラスごとに生徒の成績を列挙した表。

「B」と「C」はクラスのモードであり、クラスのモードを取得したい
BIO...B 
CHEM...C 


:私は次のようになり、結果セットをしたいです。

私は以下のクエリを適用したら、私は次の出力ました:2010年

Class | Score | Freq | Ranking 
2010 | B | 8  | 1 
2010 | C | 8  | 1 
2011 | A | 10 | 1 
2012 | B | 11 | 1 

を、私は同じ周波数で2つのグレードがあります。どうすればいいですか?最高のスコアを表示したいだけです。この場合は「B」になります。それをどうすれば実現できますか?私は、文字の等級にランキングを割り当てる必要がありますが、私はどのようによく分かりません。お知らせ下さい。おかげさまで

前のポスト: SQL Server mode SQL

私は、データを取得するために使用されるクエリは、ピーターから答えた:

;WITH Ranked AS ( 
SELECT 
    ClassName, Grade 
    , GradeFreq = COUNT(*) 
    , Ranking = DENSE_RANK() OVER (PARTITION BY ClassName ORDER BY COUNT(*) DESC) 
FROM Scores 
GROUP BY ClassName, Grade 
) 
SELECT * FROM Ranked WHERE Ranking = 1 

答えて

5

変更:

​​

へ:

SELECT Class, MIN(Grade) AS HighestGrade, Freq, Ranking 
FROM Ranked 
WHERE Ranking = 1 
GROUP BY Class, Freq, Ranking 
+0

大丈夫、私は変更を加えました。それはうまく動作します。私はちょうどこのクエリでMIN関数の使用を消化しようとしています。ありがとう。 – Frida

+0

MIN()の理由はアルファベットの中では「より高い」等級がより早く起こるからです。 2つがモードのために結ばれているときに、より良い等級を返すことを望むので、min関数を介してアルファベットの開始に近いものを見つけることは、これを行うのに役立ちます。 – zipppy