1. 程式人生 > >Oracle中rank() over, dense_rank(), row_number() 的區別

Oracle中rank() over, dense_rank(), row_number() 的區別

size oracl 結果集 title 如果 str top () course

摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm

Oracle 中 rank() over, dense_rank(), row_number() 的區別

假設現在有一張學生表student,學生表中有姓名、分數、課程編號,現在我需要按照課程對學生的成績進行排序。

select * from student

技術分享圖片

1. rank over ()可以實現對學生排名,特點是成績相同的兩名是並列,如下1 2 2 4 5

select name,
       course,
       rank() over(partition by course order
by score desc) as rank from student;

技術分享圖片

2. dense_rank()和rank over()很像,但學生成績並列後並不會空出並列所占的名次,如下1 2 2 3 4

select name,
       course,
       dense_rank() over(partition by course order by score desc) as rank
  from student;

技術分享圖片

3. row_number這個函數不需要考慮是否並列,那怕根據條件查詢出來的數值相同也會進行連續排名

select name,
       course,
       row_number() 
over(partition by course order by score desc) as rank from student;

技術分享圖片

答疑:

1. partition by用於給結果集進行分區。

2. partition by和group by有何區別?

partition by只是將原始數據進行名次排列(記錄數不變)


group by是對原始數據進行聚合統計(記錄數可能變少, 每組返回一條)

3. 使用rank over()的時候,空值是最大的,如果排序字段為null, 可能造成null字段排在最前面,影響排序結果。

可以這樣:

rank over(partition by
course order by score desc nulls last)

更多Oracle相關信息見Oracle 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新鏈接地址:http://www.linuxidc.com/Linux/2015-04/116349.htm 技術分享圖片

Oracle中rank() over, dense_rank(), row_number() 的區別