1

各生徒の成績に応じて、各生徒のランクを計算したいと思います。しかし、マークが -ve 値にある場合、クエリは適切な回答を表示しません。

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

私を助けてくれる人はいますか?

4

5 に答える 5

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」倒したかを尋ねます。そして、あなたは混乱しているように見えます。

于 2012-12-05T11:37:34.897 に答える
1

MSSQL 2008では DENSE_RANK() 関数を使用する必要があります。

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

また、ここにあなたのクエリがあります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
于 2012-12-05T11:24:55.850 に答える
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
于 2012-12-05T11:37:54.747 に答える
0

出力は正しく、4 人の学生が 0 で 8 位にランクされたため、-ve スコアにより問題はありません。8-8 8-9 8-10 8-11

これがカウント方法なので、次のランクは明らかに 12 になります。

于 2012-12-05T11:20:53.367 に答える
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
于 2012-12-05T11:26:34.070 に答える