Как я могу сгруппировать оценки студентов в квинтиль, используя SQL Server 2008
Может ли кто-нибудь помочь мне сгруппировать оценки студентов в квинтиль? Я думаю, что есть особенность в SQL Server 2012, но все же у нас нетt upgraded to it as we are using 2008R2. I tried
Ntile(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