Oracel:数据分组排序函数

1、rownum函数

先生成序号,再排序

序号不重复

  • rownum会先对表中的每条数据都依次递增的生成一个序号,然后再进行排序。函数会使1~m条数据每一条都是以1作为序列开始值
  • rownum直接作为限制条件时:
  1. 使用rownum<n或rownum<=n,查询出当前全量数据中的前n-1或n条数据
  2. 使用rownum>=1,查询出全量数据
  3. rownum>=n(n不为1)或rownum>n,查询结果为空

2、row_number函数

先排序再生成序号

序号不重复

  • row_number是先排序再生成序号,它会为查询出来的每一行记录生成一个序号,依次排序且不重复 
  • 语法:row_number() over(partition by column1,column2) order by column3 desc|asc;
关键字说明
  partition by用于指定分组的列, 当使用 partition by 参数时,序号可能不是唯一的,因为序号的生成只会在当前分组中唯一,下一个分组又将从1开始计算
order by用于指定排序的列
--查看score表中最新一次英语考试学生成绩
select * from (
      select t.class,t.id,t.name,t.subject,t.grade,t.import_time,
             row_number() over(partition by id,subject order by  t.import_time) rn
             from student_score t
)
where subject='英语'
and rn = 1;

3、rank函数

先分组再排序

序号会重复

  • rank函数

  • 会按照排序值相同的为一个序号,第二个不同排序值将按照前面所有行的递增值,而不是当前序号加1,重复的同号

  • 语法:rank() over(partition by column1,column2) order by column3 desc|asc;

关键字说明
 partition by当指定 partition by参数时,将根据指定的字段分组,进行分组计算序号值,序号值只在当前分组中有效,且每一组的开始序列号都是1
select t.empno,
      t.ename,
      t.job,
      t.mgr,
      t.hiredate,
      t.sal,
      t.comm,
      t.deptno,
      rank() over(order by t.job) rn
from emp t;

4、dense_rank函数

先分组再排序

  • 序号会重复
  • dense_rank与 rank区别在于,第二个不同排序值,是对当前序号值加1
  • 语法:dense_rank() over(partition by column1,column2) order by column3 desc|asc;
    select t.empno,
          t.ename,
          t.job,
          t.mgr,
          t.hiredate,
          t.sal,
          t.comm,
          t.deptno,
          dense_rank() over(partition by t.deptno order by t.job) rn
    from emp t;

5、按照指定顺序排序

使用decode函数,通过给定返回值完成指定顺序排序

decode函数语法: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

select * from (    
        select t.name,t.subject,t.grade,
               row_number() over(partition by t.name,t.subject order by  t.import_time) rn
        from student_score t
)
where rn = 1
and subject = '数学'
order by decode(name,'小许',1,'小张',2,'小胡',3,'小江',4);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值