第一步把grade表的score按照岗位分组并降序排序,即---注:此时的窗口函数的排序用的是并列且连续的dense_rank,因为结果示例的java的显示有提示。 (select id,language_id,score, dense_rank() over(partition by language_id order by score desc) as r from grade) as g 第二步把language的id和上述结果的language_id,进行右链接,并用where筛选出分数为前二的结果,并且select显示出id、name和score即 select g.id,l.name,g.score from language as l right join 第一步结果 on l.id=g.language_id where g.r=1 or g.r=2 第三步,对以上所得结果,按照l.name进行生序排序,即完整结果 select g.id,l.name,g.score from language as l right join (select id,language_id,score, dense_rank() over(partition by language_id order by score desc) as r from grade) as g on l.id=g.language_id where g.r=1 or g.r=2 order by l.name