2012-12-05 32 views
1

我想根據他獲得的分數來計算每個學生的排名。但是,如果標記處於-ve值,則查詢不會顯示適當的答案。自加入sql生成排名

SELECT a1.ResultByTestId, a1.ObtainedMarks, COUNT(a2.ObtainedMarks) Rank 
FROM ResultByTest a1, ResultByTest a2 
WHERE a1.ObtainedMarks < a2.ObtainedMarks 
     or 
     (a1.ObtainedMarks=a2.ObtainedMarks and a1.StudentId = a2.StudentId) 
GROUP BY a1.ObtainedMarks, a1.ResultByTestId 
ORDER BY a1.ObtainedMarks DESC, Rank DESC 

,並回答表是: -

resutlByTestId ObtainedMarks Rank 

11    36    1 
10    22    2 
3     9    3 
9     7    4 
6     5    5 
8     3    6 
7     2    7 
4     0    8 
5     0    8 
1     0    8 
2     0    8 
13    -5    12 

有沒有人幫我嗎?

回答

1

你應該在2008年MSSQL使用DENSE_RANK() function

SELECT ResultByTestId, ObtainedMarks, 
     DENSE_RANK() OVER (order by ObtainedMarks desc) as Rank 
FROM ResultByTest 
ORDER by ObtainedMarks DESC; 

也在這裏是你的闕RY與COUNT(DISTINCT <>)

SELECT a1.ResultByTestId, a1.ObtainedMarks, 
COUNT(DISTINCT a2.ObtainedMarks) Rank 
FROM ResultByTest a1, ResultByTest a2 
WHERE a1.ObtainedMarks < a2.ObtainedMarks 
     or 
     (a1.ObtainedMarks=a2.ObtainedMarks and a1.StudentId = a2.StudentId) 
GROUP BY a1.ObtainedMarks, a1.ResultByTestId 
ORDER BY a1.ObtainedMarks DESC, Rank DESC 
+0

您的幫助,但我想排名9的標記是-5。 – mitali

+0

然後只是改變你的查詢'COUNT(DISTINCT a2.ObtainedMarks)' – valex

+0

非常感謝你。但是你可以告訴我,如果我想通過使用Rank()函數來計算排名,那你建議我。 – mitali

0

輸出是正確的,沒有問題,因爲-ve得分爲四名學生得到0和排名第8 所以 8-8 8-9 8-10 8-11

這是它將如何計算這樣下次排名將明顯12

+0

是的,我知道,這是計算8級4時間,所以接下來的排名是12,這是爲我創造的問題,我想排名後9 8 12.不感謝名單 – mitali

0
--setup test data 

DECLARE @ResultByTest TABLE (ResultByTestId int, ObtainedMarks int) 

INSERT INTO @ResultByTest VALUES 
(11,    36), 
(10,    22), 
(3,     9), 
(9,     7), 
(6,     5), 
(8,     3), 
(7,     2), 
(4,     0), 
(5,     0), 
(1,     0), 
(2,     0), 
(13,    -5) 

-- this will give you the results you have 

select *, RANK() OVER (ORDER BY ObtainedMarks DESC) AS [Rank] 
from @ResultByTest 

-- this will give you the results I think you want 

select *, DENSE_RANK() OVER (ORDER BY ObtainedMarks DESC) AS [Rank] 
from @ResultByTest 
2

您可以用Dense_Rank功能

Select 
    StudentID, 
    ObtainedMarks, 
    Dense_Rank() Over (Order By ObtainedMarks Desc) as Rank 
From 
    ResultByTest 

http://sqlfiddle.com/#!3/a9e5c/1

,你通常會使用排名之所以這樣做,就是當你問的人誰得到-5你從哪裏來的,他們說「9號」。然後你問,有多少人打你「12」。然後你看起來很困惑。

0

使用DENSE_RANK來消除間隙。

DECLARE @ObtainedMarks TABLE (
ResultByTestId INT, 
ObtainedMarks INT, 
StudentId INT 

) 

INSERT INTO @ObtainedMarks VALUES 
(1,0,1), 
(2,0,1), 
(3,9,1), 
(4,0,1), 
(5,0,1), 
(6,5,1), 
(7,2,1), 
(8,3,1), 
(9,7,1), 
(10,22,1), 
(11,36,1), 
(13,-5,1) 

SELECT 
    ResultByTestId, 
    ObtainedMarks, 
    DENSE_RANK() OVER (order by ObtainedMarks desc) [Rank] 
FROM @ObtainedMarks