Oracle 写一个查询,该查询将获取每个科目中前三名学生的姓名以及他们的分数

Oracle 写一个查询,该查询将获取每个科目中前三名学生的姓名以及他们的分数,oracle,plsql,Oracle,Plsql,我是PL/SQL新手,需要查询以下场景: 2张表:第一张表,带卷号、名称 第二卷,卷号,科目n标记 需要写一个查询,该查询将获取每个科目中排名前三的学生姓名以及他们的分数 我已经为上述问题编写了以下查询,但它没有获得正确的结果: SELECT TABLE1.NAME, MAX(TABLE2.MARKS) FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.ROLL_NO = TABLE2.ROLL_NO GROUP BY SUB ORDER BY TABLE2

我是PL/SQL新手,需要查询以下场景:

2张表:第一张表,带卷号、名称 第二卷,卷号,科目n标记 需要写一个查询,该查询将获取每个科目中排名前三的学生姓名以及他们的分数

我已经为上述问题编写了以下查询,但它没有获得正确的结果:

SELECT TABLE1.NAME, MAX(TABLE2.MARKS) 
FROM 
TABLE1 
INNER JOIN 
TABLE2
ON TABLE1.ROLL_NO = TABLE2.ROLL_NO
GROUP BY SUB
ORDER BY TABLE2.MARKS
HAVING ROWNUM <3

您可以像这样使用行数窗口函数

SELECT
 *
FROM ( 

  SELECT
     MARKS.ROLL_NO
   , MARKS.SUBJECT
   , MARKS.MARKS 
   , ROW_NUMBER() OVER (PARTITION BY ROLL_NO ORDER BY MARKS DESC) AS rank 
  FROM
   MARKS
) MARKS_RANKED
INNER JOIN
 STUDENT
ON
 MARKS_RANKED.ROLL_NO = STUDENT.ROLL_NO
 WHERE 
  rank <= 3

演示

使用示例数据共享表格。。那样你会变得更好的。。解决方案涉及MySQL的用户变量,因为ROWNUM不存在于MySQL中。如果您是PL/SQL新手,为什么要标记MySQL?我相信您使用的是OracleI,我已经更新了上面的表数据
SELECT
 *
FROM ( 

  SELECT
     MARKS.ROLL_NO
   , MARKS.SUBJECT
   , MARKS.MARKS 
   , ROW_NUMBER() OVER (PARTITION BY ROLL_NO ORDER BY MARKS DESC) AS rank 
  FROM
   MARKS
) MARKS_RANKED
INNER JOIN
 STUDENT
ON
 MARKS_RANKED.ROLL_NO = STUDENT.ROLL_NO
 WHERE 
  rank <= 3