17,382
社区成员




--如果即使分数相等,也只取5位学生,使用row_number(),
--如果允许并列,且允许名次不连续,使用rank(),
--如果允许并列,且名次连续,使用dense_rank()
--1.
--法1
SELECT st.student_name, sc.score, co.course_name, rnk
FROM (SELECT t.*,
dense_rank() over(PARTITION BY t.course_id ORDER BY t.score DESC) rnk
FROM score t) sc,
student st,
course co
WHERE sc.student_id = st.student_id
AND sc.course_id = co.course_id
AND rnk <= 5;
--法2
SELECT *
FROM score sc, student st, course co
WHERE sc.student_id = st.student_id
AND sc.course_id = co.course_id
AND 5 > (SELECT COUNT(*)
FROM score t
WHERE t.course_id = sc.course_id
AND t.score > sc.score)
--2.
SELECT st.student_name, sc.score, co.course_name, rnk
FROM (SELECT t.*,
dense_rank() over(PARTITION BY t.course_id ORDER BY t.score DESC) rnk
FROM score t) sc,
student st,
course co
WHERE sc.student_id = st.student_id
AND sc.course_id = co.course_id
AND rnk = 3;