rank,dense_rank,row_number

1.ROW_NUMBER()

定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名(因为学生成绩有相同排名 他只是按顺序排号 没用相同),一般多用于分页查询, 比如查询前10个 查询10-100个学生。

实例:

1.1对学生成绩排序

这里写图片描述 
这里number就是每个学生的序号 根据studentScore(分数)进行desc倒序

1.2获取第二个同学的成绩信息

这里写图片描述 
这里用到的思想就是 分页查询的思想 在原sql外再套一层select  where t.number>=1 and t.number<=10 是不是就是获取前十个学生的成绩信息纳。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值