rank() over() , row_number() over() , dense_rank() over()
注意 :
row_number(): 连续排序, 不会有重复,每一行记录指定一个唯一的排名.
rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。如 1,1,3,4,5,6 或 1,2,2,2,5,6
dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级. 如 1,2,2,3,4,5,6
另 :
1. partition by 用于给结果集进行分区。就是partion by执行顺序查询出结果集后.
2. partition by和group by有何区别?
partition by只是将原始数据进行名次排列(记录数不变)
group by是对原始数据进行聚合统计(记录数可能变少, 每组返回一条)
3. order by 时null值排序
MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的。
如果按照score desc 排序, 且让null值排在最前, 可以使用 : select * from score where course = '数学' order by -score asc ; 即:把-号(负号)放到要排序的列名前,并把asc替换为desc
Oracle 数据库, 在order by排序的时候,如果存在NULL值,那么NULL是最大的。
如果按照score desc 排序, 且让null值排在最后, ,可以使用select * from course order by score desc nulls last ;
假设现在有一张学生成绩表course,学生表中有学号, 姓名, 科目, 分数, 现在我需要按照课程对学生的成绩进行排序。
1. rank over ()可以实现对学生排名,特点是成绩相同的两名是并列.
2. dense_rank()和rank over()很像,但学生成绩并列后并不会空出并列所占的名次,如下1 2 2 3 4
3. row_number这个函数不需要考虑是否并列,那怕根据条件查询出来的数值相同也会进行连续排名
row_number的用途的非常广泛,排序最好用它,一般可以用来实现web程序的分页,他会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。