我有一个像这样的数据集
student_id, course_id, grade
1 , 1, 2
1, 2, 5
1, 3 ,5
2, 3, 5
2, 1, 2
3, 1, 1
3, 2, 4
我在sqlfiddle.com上为此创建了一个架构,如下所示:
CREATE TABLE enrollments(
STUDENT_ID INT NOT NULL,
COURSE_ID INT NOT NULL,
GRADE INT NOT NULL
);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(1, 1, 2);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(1, 2, 5);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(1, 3, 5);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(2, 3, 5);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(2, 1, 2);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(3, 1, 1);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(3, 2, 4);
INSERT INTO enrollments
(STUDENT_ID,COURSE_ID,GRADE) VALUES
(3, 3, 4);
现在这是我想要的:
一个查询,该查询返回具有Student_id,course_id,成绩列的表,并且仅包含与每个学生在其任何课程中都能达到的最高成绩相对应的表行。 如果学生在多个课程中均获得相同的最高成绩,则仅显示与课程ID最低的课程对应的行。按student_id对输出进行排序。
所以我写了以下查询:
select STUDENT_ID, COURSE_ID, GRADE
from
(
select STUDENT_ID, rank() over(PARTITION BY STUDENT_ID ORDER BY GRADE Desc)
as grade_rank,
rank() over(PARTITION BY STUDENT_ID ORDER BY COURSE_ID asc) as course_rank
from enrollments
) as ss
where grade_rank=1 and course_rank=1
我想测试这是否是sqlfiddle上正确的逻辑,但它会为查询抛出错误
错误:列“ course_id”不存在位置:20
已在此处成功创建架构。
这有什么问题,以及如何测试这是否是正确的逻辑。如果逻辑错误,请在代码中突出显示错误。
谢谢
答案 0 :(得分:1)
如果要在外部查询中选择列,则也必须在内部查询中选择列。另外,对于两列,都必须使用一个RANK()
和一个ORDER BY
。
SELECT STUDENT_ID,
COURSE_ID,
GRADE
FROM (SELECT STUDENT_ID,
COURSE_ID,
GRADE,
rank() OVER (PARTITION BY STUDENT_ID
ORDER BY GRADE DESC,
COURSE_ID ASC) R
FROM ENROLLMENTS) SS
WHERE R = 1;