我对技术一般抱有够用就好的态度,一般在网上或者书上找了贴合的解决方案,放到实际中发现好用就行了,不再深究,等出了问题再说。

因此,我对Oracle中中形成有效序列的方法集中在rownum,row_number和rank三种方式,其中rank以简短写法(相对于row_number)和不会加深层次(相对于rownum)成为我的首选。

但是,在一次SQL求中位数方案https://www.cnblogs.com/xiandedanteng/p/12677688.html比较中,我发现有一种方案出不来结果,在排查中发现rank形成的序列恰巧在中值附近形成了空隙,导致查询不出结果,于是当时换用了row_number函数使得结果正常,一查书《精通Oracle SQL》才发现我应该使用形成连续序列的row_number或是dense_rank函数。

三种函数区别如下:

名称 存在并列时是否会跳过 是否确定性函数 相同值的处理
rank 会,因此会在排名里留下空隙 是,相同值排名在重复查询中也能保持一致 同值同编号,编号可能不连续
dense_rank 不会,在需要连续排名时该使用它 是,重复执行查询也会返回一致的数据 同值同编号,编号连续
row_number 不会,会为结果集中每一行分配唯一编号 否,相同值的序列在重复查询中可能会不一致。 同值编号顺延,编号连续

光是看书很容易略过,上手实操出现疑问再找书解决问题才印象深刻,这就是理论和实践的相互促进。

--2020年4月12日--

光用语言描述不大直观,直接查询结果会更明了。

建表:

 create table hy_emp(
id number(4,0) primary key,
name nvarchar2(20) not null,
salary integer not null)

充值:

insert into hy_emp(id,name,salary) values('','N1','');
insert into hy_emp(id,name,salary) values('','N2','');
insert into hy_emp(id,name,salary) values('','N3','');
insert into hy_emp(id,name,salary) values('','N4','');
insert into hy_emp(id,name,salary) values('','N5','');
insert into hy_emp(id,name,salary) values('','N6','');
insert into hy_emp(id,name,salary) values('','N7','');
insert into hy_emp(id,name,salary) values('','N8','');
insert into hy_emp(id,name,salary) values('','N9','');
insert into hy_emp(id,name,salary) values('','N10','');
insert into hy_emp(id,name,salary) values('','N11','');
insert into hy_emp(id,name,salary) values('','N12','');

三种函数效果如下:

--2020-04-13--

rank,dense_rank和row_number函数区别的更多相关文章

  1. 知方可补不足~row_number,rank,dense_rank,ntile排名函数的用法

    回到目录 这篇文章介绍SQL中4个很有意思的函数,我称它的行标函数,它们是row_number,rank,dense_rank和ntile,下面分别进行介绍. 一 row_number:它为数据表加一 ...

  2. sqlserver 中row_number,rank,dense_rank,ntile排名函数的用法

    1.row_number() 就是行号 2.rank:类似于row_number,不同之处在于,它会对order by 的字段进行处理,如果这个字段值相同,那么,行号保持不变 3.dense_rank ...

  3. 关于sql row_number,rank,dense_rank,ntile函数

    row_number排序最好用它,它依次排名,不出现相同名次,如:1,2,3,4,5 rank出现相同排名,且跳过相同的排名号排下一名,如:1,1,3,4,5, dense_rank出现相同排名,不跳 ...

  4. SQL窗口函数RANK(),Dense_Rank(),row_number(),NTILE()

    数据源 CREATE TABLE student( no int, ca ), name ), subject ), scorce int ); /* 数据 */ , ); , ); , ); , ) ...

  5. [转]oracle分析函数Rank, Dense_rank, row_number

    oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 ==================== ...

  6. oracle分析函数Rank, Dense_rank, row_number

    http://www.cnblogs.com/wuyisky/archive/2010/02/24/oracle_rank.html 目录=============================== ...

  7. 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF

    1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...

  8. Oracle 的开窗函数 rank,dense_rank,row_number

    1.开窗函数和分组函数的区别 分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算. 开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据 ...

  9. Oracle中rank() over, dense_rank(), row_number() 的区别

    摘自:http://www.linuxidc.com/Linux/2015-04/116349.htm Oracle 中 rank() over, dense_rank(), row_number() ...

随机推荐

  1. (数据科学学习手札92)利用query()与eval()优化pandas代码

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 利用pandas进行数据分析的过程,不仅仅是计算 ...

  2. 2020-05-08:mycat部署数据库集群的时候 遇到了哪些坑

    福哥答案2020-05-08:答案仅供参考,来自群员 使用activity时,连接mycat设置进去的序列化的流程变量,反序列化会报错这个类型字段类型是blob类型,mycat对这种类型处理时有点问题

  3. 代码优化之return 减少括号嵌套

    代码优化之return 减少括号嵌套   例如下面的公共方法 // 优化 substring方法   解决边界越界问题 空指针问题 优化前 public static String subString ...

  4. C#设计模式之9-装饰者模式

    装饰者模式(Decorator Pattern) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/405 访问. 装饰者模 ...

  5. [luogu4140] 奇数国

    题目 在一片美丽的大陆上有100000个国家,记为1到100000.这里经济发达,有数不尽的账房,并且每个国家有一个银行.某大公司的领袖在这100000个银行开户时都存了3大洋,他惜财如命,因此会不时 ...

  6. 实现1.双击自动关联文件类型打开 2.PC所有驱动器 3.小型资源管理器

    感谢各位这里实现:双击自动关联文件类型打开 2.PC所有驱动器 3.小型资源管理器!! 首先主页面: 2.运用DriveInfo驱动器的信息:获得整个系统磁盘驱动!!,运用frorach循环遍历到Tr ...

  7. Storcli64 工具操作指南

    1.1 介绍 storcli64可对LSIRAID卡基本操作进行管理,本文主要是对LSIRAID卡常使用到的命令进行介绍 1.2 基本语法 获取控制器号:storcli64 /call show al ...

  8. windows 下 安装 RabbitMQ

    RabbitMQ是一个在AMQP协议标准基础上完整的.可复用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器.它扮演 ...

  9. es6中的Set和Map

    Set: (1)set的key是number类型,从0开始 (2)向 Set 加入值的时候,不会发生类型转换,5和"5"是两个不同的值 (3)当向Set add相同的值时,会去掉重 ...

  10. Robot Framework(1)——环境搭建及安装

    一.了解Robot Framework Robot Framework不是一个测试工具,准确来说,它是一个自动化测试框架,或者说它是一个自动化测试平台 特性如下: 1.支持关键字驱动.数据驱动和行为驱 ...