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;