2012-11-07 53 views
6

我已经看到了以前的帖子的答案,这工作正常,但我有一个小小的困境。 采取相同的情景:在SQL中计算模式


一张表,列出学生的成绩每班。我想要的结果集,看起来像:

BIO...B 
CHEM...C 


凡“B”和“C”是该类的模式,并希望得到该类的模式。

一旦我应用了下面的查询,我得到了以下的输出:

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

在2010年,我有两个牌号,具有相同的频率。如果......我只想显示最高分,在这种情况下将是“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()的工作原因是因为“更高”的成绩正好在字母表的前面。既然你想在两个模式绑定的时候返回更好的成绩,那么通过min函数找到更接近字母表开头的那个,这有助于做到这一点。 – zipppy