oracle 每个学生的第二高分数

9udxz4iz  于 2022-11-22  发布在  Oracle
关注(0)|答案(3)|浏览(180)
ID_S    STUDENT_ID  GRADE
1   1   22
2   1   33
3   1   44
4   1   55
5   2   66
6   2   22
7   2   33
8   2   44
9   3   55
10  3   66
11  3   22
12  3   33
13  4   44
14  4   55
15  4   66
16  4   22
17  5   33
18  5   44
19  5   55
20  5   66

我必须提取5个学生的第二高分数(每个学生有四个不同的分数)。该表应如下所示:

Student_id  Grades
1             44
2             44
3             55
4             55
5             55

但第一个学生的成绩是55分。
这是我代码:

select student_id, max(grade) as "second highest grades" from grade_list7 
where grade not in (select max(grade) from grade_list7)
group by student_id;

这到底是怎么回事?

4bbkushb

4bbkushb1#

这里需要类似于RANK()的解析函数:

WITH cte AS (
    SELECT g.*, RANK() OVER (PARTITION BY student_id ORDER BY grade DESC) rnk
    FROM grade_list7 g
)

SELECT student_id, grade
FROM cte
WHERE rnk = 2
ORDER BY student_id;

两个或多个等级并列的问题在这里可能很重要,您可能希望使用DENSE_RANK()而不是RANK(),这取决于您想要的行为。

tvmytwxo

tvmytwxo2#

您的subselect需要获取specidifc用户的max,因此您需要添加stundet id
也可以使用RANK方法或Maybe DENSE_RANK
第一个
小提琴

v6ylcynt

v6ylcynt3#

也许这可能行得通:

SELECT student_id, MAX(grade) AS "Second Highest Grades"
FROM grade_list7
WHERE grade < (SELECT MAX(grade) FROM grade_list7)
GROUP BY student_id;

相关问题