文章目录
- 前言
- 介绍
- demo案例测试
- 测试前的准备
- rank()
- dense_rank()
- row_number()
前言
分析函数在oracle
中比较常见,但用的不多,今天有幸碰见,索性做一次使用的总结说明。
介绍
oracle中的分析函数,常见的有下面的三种:
-
rank() 当排序的数据值是一样的时候,排序相同,但需要跳跃。
什么叫排序跳跃?
如下所示:
当出现排名一样的时候,排名是一样的,但是如果出现间隔,则排序会出现不一致的现象。
-
dense_rank() 排序的数据值是一样的时候,排序相同,序号连续。
如何理解上面所说的序号连续?
-
row_number() 排序好的数据值一样的时候,排序不同,类似 rownum。
demo案例测试
测试前的准备
创建表并新增测试数据:
create table XJ_TEST_LTOH
(
stuid VARCHAR2(20),
stuname VARCHAR2(40),
coursename VARCHAR2(40),
score INTEGER
)
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201001', '张三', '数学', 40);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201001', '张三', '语文', 50);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201001', '张三', '理综', 120);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201011', '李四', '数学', 40);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201011', '李四', '语文', 45);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201011', '李四', '理综', 120);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201031', '王五', '数学', 54);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201031', '王五', '语文', 50);
insert into xj_test_ltoh (STUID, STUNAME, COURSENAME, SCORE)
values ('sc202201031', '王五', '理综', 100);
执行后,表中的数据如下所示:
rank()
值相同,排名相同,序号跳跃
select rank() over(order by score desc) nums ,t.score from xj_test_ltoh t
dense_rank()
值相同,排名相同,排名序号连续
。
select dense_rank() over(order by score desc) nums ,t.score from xj_test_ltoh t
row_number()
序号连续,即使值相同。
select row_number() over(order by score desc) nums ,t.score from xj_test_ltoh t