摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm
Oracle 中 rank() over, dense_rank(), row_number() 的區(qū)別
假設(shè)現(xiàn)在有一張學(xué)生表student,學(xué)生表中有姓名负敏、分?jǐn)?shù)遭笋、課程編號(hào)星持,現(xiàn)在我需要按照課程對(duì)學(xué)生的成績(jī)進(jìn)行排序黔夭。
select * from student
1. rank over ()
可以實(shí)現(xiàn)對(duì)學(xué)生排名臼朗,特點(diǎn)是成績(jī)相同的兩名是并列熟空,如下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()
很像伯复,但學(xué)生成績(jī)并列后并不會(huì)空出并列所占的名次,如下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
這個(gè)函數(shù)不需要考慮是否并列更哄,那怕根據(jù)條件查詢出來的數(shù)值相同也會(huì)進(jìn)行連續(xù)排名
select name,
course,
row_number() over(partition by course order by score desc) as rank from student;
答疑:
1. partition by
用于給結(jié)果集進(jìn)行分區(qū)芋齿。
2. partition by
和group by
有何區(qū)別腥寇?
partition by
只是將原始數(shù)據(jù)進(jìn)行名次排列(記錄數(shù)不變)
group by
是對(duì)原始數(shù)據(jù)進(jìn)行聚合統(tǒng)計(jì)(記錄數(shù)可能變少, 每組返回一條)
3. 使用rank over()
的時(shí)候,空值是最大的觅捆,如果排序字段為null, 可能造成null字段排在最前面赦役,影響排序結(jié)果。
可以這樣:
rank over(partition by course order by score desc nulls last)