窗口函数:rank()、dense_rank()、row_number()的区别

本文转自:https://blog.csdn.net/zhouseawater/article/details/72897130


rank():跳跃排序;
dense_rank():连续排序;
row_number():没有重复值的排序(记录相等也是不重复的),可以进行分页使用。

首先我们来准备一下数据。先建立个测试表。如下:

REATE TABLE "TEST_EMP" 
(
   "EMPNO"              NUMBER(4,0),
   "ENAME"              VARCHAR2(10),
   "JOB"                VARCHAR2(9),
   "MGR"                NUMBER(4,0),
   "HIREDATE"           DATE,
   "SAL"                NUMBER(7,2),
   "COMM"               NUMBER(7,2),
   "DEPTNO"             NUMBER(2,0)
); 
COMMENT ON COLUMN "TEST_EMP"."EMPNO" IS
'员工ID'; 
COMMENT ON COLUMN "TEST_EMP"."ENAME" IS
'员工姓名'; 
COMMENT ON COLUMN "TEST_EMP"."JOB" IS
'职位'; 
COMMENT ON COLUMN "TEST_EMP"."MGR" IS
'员工管理者ID'; 
COMMENT ON COLUMN "TEST_EMP"."HIREDATE" IS
'入职日期';
COMMENT ON COLUMN "TEST_EMP"."SAL" IS
'薪资';
COMMENT ON COLUMN "TEST_EMP"."COMM" IS
'绩效'; 
COMMENT ON COLUMN "TEST_EMP"."DEPTNO" IS
'部门ID';

插入一些数据。自己随便加一些就好。如下:

第一个,row_numer(),这个排序函数的特点是相同数据,先查出的排名在前,没有重复值。像这里的sal相同,先查出来的数据的rank排名优先。如下图:

第二个,rank()函数,是跳跃排序,相同数据(这里为sal列相同)排名相同,比如并列第1,则两行数据(这里为rank列)都标为1,下一位将是第3名.中间的2被直接跳过了。排名存在重复值。

第三个,dense_rank(),这个是连续排序的,比如两条并列第1,则两行数据(这里为rank列)都标为1,下一个排名将是第2名。

其中需要注意的是:over(partition by class order by property) 按照property排序进行累计,order by是个默认的开窗函数,按照class分区。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值