詳解:http://www.jb51.net/article/51627.htm數據庫
注意:使用rank()over(order by 排序字段 順序)排序的時候,空值是最大的
(若是排序字段爲null,可能形成在排序時將null字段排在最前面,影響排序的正確性。
因此建議將dense_rank()over(order by 列名 排序)改成dense_rank()over(order by 列名 排序 nulls last)
這樣只要排序字段爲null,就會放在最後,而不會影響排序結果).
函數
問題:.net
分區與分組有什麼區別?htm
分區使用的是rank() over (partition by 分區字段 order by 排序字段 順序), 分組使用的是 group by 分組字段排序
·分區只是將原始數據進行名次排列(記錄數不變),it
·分組是對原始數據進行聚合統計(記錄數變少,每組返回一條),注意:聚合。io
--------------------------------------------------------------------------------------------ast
1.兩種計算方式(連續,不連續),對應函數:dense_rank,rank。select
2.兩種排名方式(分區和不分區):使用和不使用partition。語法
語法:
rank() over (order by 排序字段 順序)
rank() over (partition by 分區字段 order by 排序字段 順序),
---------------------------------------------------------------------------------
1,實例:查詢各學生科目爲Oracle排名(簡單排名)
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'
2.對比:rank()與dense_rank():非連續排名與連續排名(都是簡單排名)
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'
數據庫中有兩個並列的第一名
區別:使用rank進行的排名,結果是不連續的 :1 1 3
使用dense_rank進行的排名,結果是連續的: 1 1 2
3.查詢各學生各科排名(分區排名)
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