天天看點

oracle rank()和dense_rank(), row_number() 的差別

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

select * from student

oracle rank()和dense_rank(), row_number() 的差別

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

select name,

      course,

      rank() over(partition by course order by score desc) as rank

  from student;

oracle rank()和dense_rank(), row_number() 的差別

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

      dense_rank() over(partition by course order by score desc) as rank

oracle rank()和dense_rank(), row_number() 的差別

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

      row_number() over(partition by course order by score desc) as rank

oracle rank()和dense_rank(), row_number() 的差別

答疑:

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)

繼續閱讀