--已知:兩種排名方式(分區和不分區):使用和不使用partitionsql
--兩種計算方式(連續,不連續),對應函數:dense_rank,rank查詢原始數據:學號,姓名,科目名,成績 函數
select * from t_score
·查詢各學生科目爲Oracle排名(簡單排名) spa
select sc.s_id,sc.s_name,sub_name,sc.score, rank() over (order by score desc) 名次 from t_score sc where sub_name='Oracle'
對比:rank()與dense_rank():非連續排名與連續排名(都是簡單排名) .net
select sc.s_id,sc.s_name,sub_name,sc.score, dense_rank() over (order by score desc) 名次 from t_score sc where sub_name='Oracle'
·查詢各學生各科排名(分區排名) code
select sc.s_id,sc.s_name,sub_name,sc.score, rank() over (partition by sub_name order by score desc) 名次 from t_score sc
·查詢各科前2名(分區排名) blog
·相似:新聞表,求欄目點擊率在前3位的新聞。 排序
商品表,求各種別銷售額在前10位的商品。 it
select * from ( select sc.s_id,sc.s_name,sub_name,sc.score, dense_rank() over (partition by sub_name order by score desc) 名次 from t_score sc ) x where x.名次<=2
·查詢各同窗總分 io
select s_id,s_name,sum(score) sum_score from t_score group by s_id,s_name
根據總分查詢各同窗名次 class
select x.*, rank() over (order by sum_score desc) 名次 from ( select s_id,s_name,sum(score) sum_score from t_score group by s_id,s_name ) x
語法:
rank() over (order by 排序字段 順序)
rank() over (partition by 分組字段 order by 排序字段 順序)
1.順序:asc|desc 名次與業務相關:
示例:找求優秀學員:成績:降序 遲到次數:升序
2.分區字段:根據什麼字段進行分區。
轉載:http://blog.csdn.net/cczz_11/article/details/6053539