orcale的rank(排名函数)实例

详解:http://www.jb51.net/article/51627.htm数据库

注意:使用rank()over(order by 排序字段 顺序)排序的时候,空值是最大的
(若是排序字段为null,可能形成在排序时将null字段排在最前面,影响排序的正确性。
因此建议将dense_rank()over(order by 列名 排序)改成dense_rank()over(order by 列名 排序 nulls last)
这样只要排序字段为null,就会放在最后,而不会影响排序结果).
 函数

问题:.net

分区与分组有什么区别?htm

分区使用的是rank() over (partition by 分区字段 order by 排序字段 顺序), 分组使用的是 group by 分组字段排序

·分区只是将原始数据进行名次排列(记录数不变),it

·分组是对原始数据进行聚合统计(记录数变少,每组返回一条),注意:聚合。io

--------------------------------------------------------------------------------------------ast

 

1.两种计算方式(连续,不连续),对应函数:dense_rank,rank。select

 

2.两种排名方式(分区和不分区):使用和不使用partition。语法

语法:

rank() over (order by 排序字段 顺序)

rank() over (partition by 分区字段 order by 排序字段 顺序),

---------------------------------------------------------------------------------

1,实例:查询各学生科目为Oracle排名(简单排名)

select sc.s_id,sc.s_name,sub_name,sc.score,

rank() over (order by score desc) 名次

from t_score sc

where sub_name='Oracle'

2.对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名)

select sc.s_id,sc.s_name,sub_name,sc.score,

dense_rank() over (order by score desc) 名次

from t_score sc

where sub_name='Oracle'

数据库中有两个并列的第一名

区别:使用rank进行的排名,结果是不连续的 :1 1 3

使用dense_rank进行的排名,结果是连续的: 1 1 2

3.查询各学生各科排名(分区排名)

select sc.s_id,sc.s_name,sub_name,sc.score,

rank() over

(partition by sub_name(这个是学科的名字) order by score desc) 名次

from t_score sc

相关文章
相关标签/搜索