2012-11-07 20 views
6

Ho visto la risposta di un post precedente, che funziona bene ma ho un piccolo dilemma. Lo stesso scenario:Calcola modalità in SQL


Una tabella che elenca i voti degli studenti per classe. Voglio un set di risultati che assomiglia:

BIO...B 
CHEM...C 


dove il "B" e "C" sono le modalità per la classe e vogliono ottenere la modalità per la classe.

Una volta applicato il domanda sotto, ho ottenuto il seguente risultato:

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

Nel 2010, ho due gradi con la stessa frequenza. Cosa succede se ... Voglio solo mostrare il punteggio più alto, in questo caso sarà "B". Come posso ottenerlo? Avrei bisogno di assegnare classifiche ai voti delle lettere, ma non sono sicuro di come. Si prega di avvisare. Grazie.

Prima postale: SQL Server mode SQL

La query che ho usato per recuperare i dati è stata la risposta di Peter:

;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 

risposta

5

Cambio:

SELECT * FROM Ranked WHERE Ranking = 1 

A:

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

ok, ho fatto il cambiamento. Funziona bene. Sto solo cercando di digerire l'utilizzo della funzione MIN in questa query. Grazie. – Frida

+0

Il motivo per cui MIN() funziona è perché i gradi "più alti" si trovano prima nell'alfabeto. Dal momento che si desidera restituire il voto migliore quando due sono legati per la modalità, trovare quello più vicino all'inizio dell'alfabeto, tramite la funzione min, aiuta a farlo accadere. – zipppy

Problemi correlati