2012-11-07 5 views
6

Ich habe die Antwort von einem früheren Post gesehen, die gut funktioniert, aber ich habe ein kleines Dilemma. Unter dem gleichen Szenario:Calculate Modus in SQL


Eine Tabelle, die Schüler Noten pro Klasse auflisten. Ich möchte eine Ergebnismenge, die wie folgt aussieht:

BIO...B 
CHEM...C 


Wo die „B“ und „C“ sind die Modi für die Klasse und den Modus für die Klasse zu erhalten.

Sobald ich die unten Abfrage angewendet, ich erhielt die folgende Ausgabe:

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

Im Jahr 2010 habe ich zwei Typen mit der gleichen Frequenz. Was wäre, wenn .. Ich möchte nur die höchste Punktzahl anzeigen, in diesem Fall wird "B" sein. Wie kann ich das erreichen? Ich müsste den Briefnoten Ranglisten zuordnen, bin mir aber nicht sicher wie. Bitte beraten. Danke.

Vor Beitrag: SQL Server mode SQL

Die Abfrage, die ich verwendet, um die Daten die Antwort auf Abrufen von Peter war:

;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 

Antwort

5

Wechsel:

SELECT * FROM Ranked WHERE Ranking = 1 

An:

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

ok, ich habe das geändert. Es funktioniert gut. Ich versuche nur die Verwendung der MIN-Funktion in dieser Abfrage zu verdauen. Vielen Dank. – Frida

+0

Der Grund, warum MIN() funktioniert, ist, weil höhere Grade früher im Alphabet vorkommen. Da Sie die bessere Note zurückgeben wollen, wenn zwei für den Modus gebunden sind, hilft es, das zu finden, das näher am Anfang des Alphabets ist, über die Funktion min. – zipppy