1.ROW_NUMBER()
定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名(因为学生成绩有相同排名 他只是按顺序排号 没用相同),一般多用于分页查询, 比如查询前10个 查询10-100个学生。
实例:
1.1对学生成绩排序
1.2获取第二个同学的成绩信息
2.RANK()
定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里为什么和ROW_NUMBER()不一样那,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样出现相同的,他们的排名是一样的。下面看例子:
2.1对学生成绩进行排名
这里发现 ROW_NUMBER()和RANK()怎么一样?因为学生成绩都不一样所以排名和排序一样,下面改一下就会发现区别。
当出现两个学生成绩相同是里面出现变化。RANK()是 1 2 2,而ROW_NUMBER()则还是1 2 3,这就是RANK()和ROW_NUMBER()的区别了
3.DENSE_RANK()
定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?看例子:
实例:
DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()。
4.NTILE()
定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。
实例:
这里查询了3次,第一次分为1个’区’ ,所以查询结果number全是1,第二次分为2个区,查询结果为 1 1 2,意思就是 第一个 ‘区’ 为 1 1 两个编号的数据 ,第二个’区’只有2这个数据。
到这里,SQL的排名问题就说完了,下次介绍一些深层的SQL排名语句
rank,dense_rank,row_number区别
一:语法(用法): rank() over([partition by col1] order by col2) dense_rank() over([partition by col1] order by col2) row_number() over([partition by col1] order by col2) 其中[partition by col1]可省略。
二:区别 三个分析函数都是按照col1分组内从1开始排序 row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页 dense_rank() 是连续排序,两个第二名仍然跟着第三名 rank() 是跳跃拍学,两个第二名下来就是第四名 理论就不多讲了,看了案例,一下就明白了 SQL> create table t( 2 name varchar2(10), 3 score number(3)); Table created SQL> insert into t(name,score) 2 select '语文',60 from dual union all 3 select '语文',90 from dual union all 4 select '语文',80 from dual union all 5 select '语文',80 from dual union all 6 select '数学',67 from dual union all 7 select '数学',77 from dual union all 8 select '数学',78 from dual union all 9 select '数学',88 from dual union all 10 select '数学',99 from dual union all 11 select '语文',70 from dual 12 / 10 rows inserted SQL> select * from t; NAME SCORE---------- -----语文 60语文 90语文 80语文 80数学 67数学 77数学 78数学 88数学 99语文 70 10 rows selected 通过什么分组SQL> select name,score,rank() over(partition by name order by score) tt from t; NAME SCORE TT---------- ----- ----------数学 67 1数学 77 2数学 78 3数学 88 4数学 99 5语文 60 1语文 70 2语文 80 3 <----语文 80 3 <----语文 90 5 10 rows selected SQL> select name,score,dense_rank() over(partition by name order by score) tt from t; NAME SCORE TT---------- ----- ----------数学 67 1数学 77 2数学 78 3数学 88 4数学 99 5语文 60 1语文 70 2语文 80 3 <----语文 80 3 <----语文 90 4 10 rows selected SQL> select name,score,row_number() over(partition by name order by score) tt from t; NAME SCORE TT---------- ----- ----------数学 67 1数学 77 2数学 78 3数学 88 4数学 99 5语文 60 1语文 70 2语文 80 3 <----语文 80 4 <----语文 90 5 10 rows selected SQL> select name,score,rank() over(order by score) tt from t; NAME SCORE TT---------- ----- ----------语文 60 1数学 67 2语文 70 3数学 77 4数学 78 5语文 80 6语文 80 6数学 88 8语文 90 9数学 99 10 10 rows selected
大家应该明白了吧!呵呵!接下来看应用
一:dense_rank------------------查询每门功课前三名
select name,score from (select name,score,dense_rank() over(partition by name order by score desc) tt from t) x where x.tt<=3 NAME SCORE---------- -----数学 99数学 88数学 78语文 90语文 80语文 80 6 rows selected
二:rank------------------语文成绩70分的同学是排名第几。 select name,score,x.tt from (select name,score,rank() over(partition by name order by score desc) tt from t) x where x.name='语文' and x.score=70 NAME SCORE TT---------- ----- ----------语文 70 4 三:row_number——————分页查询 select xx.* from (select t.*,row_number() over(order by score desc) rowno from t) xx where xx.rowno between 1 and 3; NAME SCORE ROWNO---------- ----- ----------数学 99 1语文 90 2
数学 88 3