select t3.id,t3.name,t3.score from (select t2.*,dense_rank() over(partition by t2.name order by t2.score desc) as 'rnk' from (select t1.id,t1.name,t1.score from (select g.id,l.name,g.score from grade g left join language l on g.language_id=l.id)t1 group by t1.name,t1.id order by t1.name) t2 ) t3 where rnk < 3;