2012-11-07 10 views
6

Widziałem odpowiedź z poprzedniego postu, który działa dobrze, ale mam mały dylemat. W tym samym scenariuszu:Tryb obliczania w SQL


Tabela z listą ocen uczniów w klasie. Chcę zestaw wyników, która wygląda tak:

BIO...B 
CHEM...C 


gdzie „B” i „C” są tryby dla klasy i chcesz uzyskać tryb dla klasy.

Kiedyś zastosowano poniższe zapytanie, mam następujący wynik:

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

W 2010 roku, mam dwie klasy z taką samą częstotliwością. Co jeśli ... Po prostu chcę wyświetlić najwyższy wynik, w tym przypadku będzie to "B". Jak mogę to osiągnąć? Musiałbym przypisać rankingi do ocen literowych, ale nie jestem pewien jak. Proszę doradź. Dzięki.

Przed postu: SQL Server mode SQL

Zapytanie kiedyś odzyskać dane była odpowiedź od Piotra:

;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 

Odpowiedz

5

Zmiana:

SELECT * FROM Ranked WHERE Ranking = 1 

Do:

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

ok, dokonałem zmiany. To działa dobrze. Po prostu próbuję przetrawić użycie funkcji MIN w tym zapytaniu. Dzięki. – Frida

+0

Powodem, dla którego działa funkcja MIN(), jest fakt, że "wyższe" stopnie występują wcześniej w alfabecie. Ponieważ chcesz zwrócić lepszą ocenę, gdy dwa są powiązane z trybem, znalezienie tego bliżej początku alfabetu, za pomocą funkcji min, pomaga to osiągnąć. – zipppy