Here I have a table called Scores:
student_id | class_id | course | score |
---|---|---|---|
1 | 1 | 1 | 80 |
2 | 1 | 1 | 80 |
3 | 2 | 3 | 75 |
4 | 3 | 2 | 90 |
5 | 1 | 2 | 85 |
6 | 2 | 3 | 85 |
7 | 2 | 3 | 85 |
8 | 3 | 4 | 78 |
9 | 3 | 4 | 76 |
10 | 3 | 4 | 79 |
What I want to do is to select student_id
, class_id
, course
, score
and rank
based on the students' scores. However, we need to separate students into different groups before ranking, which means those students who have the same class_id
and course
can be ranked with each other. Plus, we need to sort the results by class_id
, course
, score
and student_id
in descending order. (You could not use rank() to do the ranking, you could only use subquery)
The results should be like:
student_id | class_id | course | score | rank |
---|---|---|---|---|
10 | 3 | 4 | 79 | 1 |
8 | 3 | 4 | 78 | 2 |
9 | 3 | 4 | 76 | 3 |
4 | 3 | 2 | 90 | 1 |
7 | 2 | 3 | 85 | 1 |
6 | 2 | 3 | 85 | 2 |
3 | 2 | 3 | 75 | 3 |
5 | 1 | 2 | 85 | 1 |
2 | 1 | 1 | 80 | 1 |
1 | 1 | 1 | 80 | 2 |
My attempt:
I could select class_id
, course
, score
and student_id
from the table Scores in descending order and rank all the students, but I have no idea how to rank the students in the same class_id
and course
CodePudding user response:
create table Scores (
student_id int,
class_id int,
course int,
score int
);
insert into Scores (student_id, class_id, course, score)
values ( 1, 1, 1, 80);
insert into Scores (student_id, class_id, course, score)
values ( 2, 1, 1, 80);
insert into Scores (student_id, class_id, course, score)
values ( 3, 2, 3, 75);
insert into Scores (student_id, class_id, course, score)
values ( 4, 3, 2, 90);
insert into Scores (student_id, class_id, course, score)
values ( 5, 1, 2, 85);
insert into Scores (student_id, class_id, course, score)
values ( 6, 2, 3, 85);
insert into Scores (student_id, class_id, course, score)
values ( 7, 2, 3, 85);
insert into Scores (student_id, class_id, course, score)
values ( 8, 3, 4, 78);
insert into Scores (student_id, class_id, course, score)
values ( 9, 3, 4, 76);
insert into Scores (student_id, class_id, course, score)
values (10, 3, 4, 79);
select student_id
, class_id
, course
, score
, RANK() OVER (
PARTITION BY class_id, course
ORDER BY score desc
) as "rank"
from Scores
order by class_id desc
, course desc
, score desc
, student_id desc
CodePudding user response:
Are you really looking for such a simple query
select student_id, class_id, course, score, rank
from scores
order by student_id desc, class_id desc, course desc, score asc
each field in order by can have be ascending or descending.