rank()對錶中的數據進行分級排序.
譬如有張學生成績統計單的表STUDENT_RESULT
name number kemu fenshu
li 0113101 高數 90
zhang 0113098 高數 80
wang 0113077 高數 70
li 0113101 物理 80
zhang 0113098 物理 90
wang 0113077 物理 70
我如果要檢索出表中高數的前兩名和物理的前兩名
那麼可以通過使用 RANK()方法達到目的
--首先 通過kemu進行分類,然後按照fenshu降序排序
select rank() over(partition by kemu order by fenshu desc) rk,t.* from student_result t
結果
rk name number kemu fenshu
1 li 0113101 高數 90
2 zhang 0113098 高數 80
3 wang 0113077 高數 70
1 zhang 0113098 物理 90
2 li 0113101 物理 80
3 wang 0113077 物理 70
--然後,檢索出rk<=2的記錄,即取出前兩名
select * from (select rank() over(partition by kemu order by fenshu desc) rk,t.* from student_result t) as y where y.rk<=2;
結果
rk name number kemu fenshu
1 li 0113101 高數 90
2 zhang 0113098 高數 80
1 zhang 0113098 物理 90
2 li 0113101 物理 80
dense_rank()和 rank()的用法完全相同,不同的是在出現分數相同的情況下
如
name number kemu fenshu
li 0113101 高數 80
zhang 0113098 高數 80
wang 0113077 高數 70
li 0113101 物理 80
zhang 0113098 物理 90
wang 0113077 物理 70
select rank() over(order by fenshu desc) rk,t.* from student_result t
的結果爲
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高數 80
2 zhang 0113098 高數 80
2 li 0113101 物理 80
5 wang 0113077 高數 70
5 wang 0113077 物理 70
而select dense_rank() over(order by fenshu desc) rk,t.* from student_result t
結果爲
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高數 80
2 zhang 0113098 高數 80
2 li 0113101 物理 80
3 wang 0113077 高數 70
3 wang 0113077 物理 70
附 row_number()的使用
select row_number() over(order by fenshu desc) rk,t.* from student_result t
rk name number kemu fenshu
1 zhang 0113098 物理 90
2 li 0113101 高數 80
3 zhang 0113098 高數 80
4 li 0113101 物理 80
5 wang 0113077 高數 70
6 wang 0113077 物理 70
fetch n rows only
取出當前記錄的前多少行
如
select row_number() over(order by user_no) from user_files fetch first 5 rows only;
oracle rank函數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.