1、rownum函数
先生成序号,再排序
序号不重复
- rownum会先对表中的每条数据都依次递增的生成一个序号,然后再进行排序。函数会使1~m条数据每一条都是以1作为序列开始值
- rownum直接作为限制条件时:
- 使用rownum<n或rownum<=n,查询出当前全量数据中的前n-1或n条数据
- 使用rownum>=1,查询出全量数据
- 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);