Как я могу сгруппировать оценки студентов в квинтиль, используя SQL Server 2008

Может ли кто-нибудь помочь мне сгруппировать оценки студентов в квинтиль? Я думаю, что есть особенность в SQL Server 2012, но все же у нас нетt upgraded to it as we are using 2008R2. I triedNtile(5)`, но он не дает желаемого результата. Мне нужно ниже квинтильной колонны

Student   Score Quintile
------------------------    
Student1     20   1
Student2     20   1
Student3     30   2
Student4     30   2
Student5     40   2
Student6     40   2
Student7     50   3
Student8     50   3
Student9     60   3
Student10    70   4
Student11    70   4
Student12    80   4
Student13    80   4
Student14    90   5

3 ответа

Решение
Below is the correct answer given by Erland Sommarskog 
Create Table #Scores(Student varchar(20), Score int); 
Insert #Scores(Student, Score) Values 
('Student1', 20) 
,('Student2', 20) 
,('Student3', 30)
,('Student4', 30)
,('Student4', 30)
,('Student4', 30)
,('Student5', 40)
,('Student6', 40)
,('Student7', 50)
,('Student8', 50)
,('Student9', 60)
,('Student10', 70)
,('Student11', 70) 
,('Student12', 80) 
,('Student13', 80) 
,('Student14', 90); 

; WITH quintiles AS (
    SELECT Score, ntile(5) OVER(ORDER BY Score) AS quintile 
    FROM   (SELECT DISTINCT Score FROM #Scores) AS s 
)
SELECT s.Student, s.Score, q.quintile
FROM   #Scores s
JOIN   quintiles q ON s.Score = q.Score
go
DROP TABLE #Scores

--by Erland Sommarskog``

Вы должны были делать что-то не так при использовании NTILE(5) - это функция для использования!

Вот моя тестовая установка:

DECLARE @Students TABLE (StudentID INT IDENTITY(1,1), StudentName VARCHAR(20), Score INT)

INSERT INTO @Students(StudentName, Score)
VALUES ('Student 1', 20), ('Student 2', 20), 
('Student 3', 30), ('Student 4', 30), 
('Student 5', 40), ('Student 6', 40), 
('Student 7', 50), ('Student 8', 50), 
('Student 9', 60), 
('Student 10', 70), ('Student 11', 70), 
('Student 12', 80), ('Student 13', 80), 
('Student 14', 90)


SELECT 
    StudentName, Score, 
    Quintile = NTILE(5) OVER(ORDER BY Score)
FROM    
    @Students

И вывод:

Заимствовано из marc_s +1

DECLARE @Students TABLE (StudentID INT IDENTITY(1,1), StudentName VARCHAR(20), Score INT)

INSERT INTO @Students(StudentName, Score)
VALUES ('Student 1', 20), ('Student 2', 20), 
('Student 3', 30), ('Student 4', 30), 
('Student 5', 40), ('Student 6', 40), 
('Student 7', 50), ('Student 8', 50), 
('Student 9', 60), ('Student 10', 70), 
('Student 11', 70),('Student 12', 80), 
('Student 13', 80),('Student 14', 90)

SELECT s.StudentName, s.Score, qm.maxQ
  FROM @Students as s
  join ( select score, MAX(Quintile) as maxQ
           from ( SELECT Score, Quintile = NTILE(5) OVER(ORDER BY Score)
                    FROM  @Students ) q 
          group by q.score ) qm
    on qm.Score = s.Score
Другие вопросы по тегам