1. 問題:如下score表有學生id、班級id、學生成績三個字段,查詢每個班級成績前三名的學生。
2. 思路:使用row_number() over函數分組排序取topN
select * from (select *,row_number() over(partition by c_id order by s_score desc) as 'rank' from score) t1 where t1.rank<4;
3. 知識點:row_number() over(partition by c1 order by c2 (desc)) 及 row_number()、rank()、dense_rank()的區別
row_number()、rank()、dense_rank()三種函數均可以根據某字段對記錄進行排序得到排列序號,排序區別如下:
row_number() 排名時不考慮並列情況
rank()考慮並列情況,但排名不連續(如1,2,3,3,5)
dense_rank()考慮並列情況,但排名連續(如1,2,3,3,4)