select id, name, score from (select g.id, l.name, g.score, dense_rank()over(partition by l.name order by g.score desc) d from grade g join language l on g.language_id=l.id order by l.name ) a where a.d<=2 order by a.name asc, a.score desc, a.id asc