oracle 中使用row_numer(),rank()及dense_rank()排序的区别

今天呢我们来看看oracle中使用row_numer(),rank()以及dense_rank()排序的区别。在最近的开发中遇到一个需要排名的列表。然后对我们上述的几个排序函数进行了了解。

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


  1. REATE TABLE "TEST_EMP"
  2. (
  3. "EMPNO" NUMBER(4,0),
  4. "ENAME" VARCHAR2(10),
  5. "JOB" VARCHAR2(9),
  6. "MGR" NUMBER(4,0),
  7. "HIREDATE" DATE,
  8. "SAL" NUMBER(7,2),
  9. "COMM" NUMBER(7,2),
  10. "DEPTNO" NUMBER(2,0)
  11. );
  12. COMMENT ON COLUMN "TEST_EMP". "EMPNO" IS
  13. '员工ID';
  14. COMMENT ON COLUMN "TEST_EMP". "ENAME" IS
  15. '员工姓名';
  16. COMMENT ON COLUMN "TEST_EMP". "JOB" IS
  17. '职位';
  18. COMMENT ON COLUMN "TEST_EMP". "MGR" IS
  19. '员工管理者ID';
  20. COMMENT ON COLUMN "TEST_EMP". "HIREDATE" IS
  21. '入职日期';
  22. COMMENT ON COLUMN "TEST_EMP". "SAL" IS
  23. '薪资';
  24. COMMENT ON COLUMN "TEST_EMP". "COMM" IS
  25. '绩效';
  26. COMMENT ON COLUMN "TEST_EMP". "DEPTNO" IS
  27. '部门ID';

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

图1-1

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

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

1-3

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

1-4

这就是它们三之间的排序的一点区别。当然,分析函数over()也是值得我们好好去了解的。

总结一下:
row_numer():按查出的记录数前后排序,序号不重复。即第1条记录序号为1,第2条记录序号2,第3条记录序号为3(不考虑3条记录的排序字段是否重复)。
rank():跳跃排序,排序字段值相同的序号相同。例如3条记录中前2条排序字段值相同,第3条不同,则前3条记录的排序号为1,1,3。
dense_rank():连续排序。例如前4条记录中,1和2的排序字段值相同,3和4的排序字段值相同,则4条记录的排序号为1,1,2,2。

前半部分转自https://blog.csdn.net/zhouseawater/article/details/72897130

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值