精华内容
下载资源
问答
  • Oracle排序函数

    千次阅读 2018-01-25 10:15:54
    下面介绍Oracle的三种排序函数: 1,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2) 2,RANK() OVER(PARTITION BY col1 ORDER BY col2) 3,DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2) 相同点:...

    下面介绍Oracle的三种排序函数:

    1,ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2)

    2,RANK() OVER(PARTITION BY col1 ORDER BY col2)

    3,DENSE_RANK() OVER(PARTITION BY col1 ORDER BY col2)

    相同点:根据col1分组,在分组内部根据col2排序

    不同点:ROW_NUMBER组内连续且唯一,RANK跳跃排序,DENSE_RANK连续排序

    例子:

    ROW_NUMBER排序:

    张三 100 1

    李四 98 2

    王五 98 3

    赵六 90 4

    孙七 80 5

    RANK排序:

    张三 100 1

    李四 98 2

    王五 98 2

    赵六 90 4

    孙七 80 5


    DENSE_RANK排序:

    张三 100 1

    李四 98 2

    王五 98 2

    赵六 90 3

    孙七 80 4



    展开全文
  • Oracle 分组排序函数

    千次阅读 2018-06-20 11:32:53
    2、亦或更加要求取出1中已经分组排序好的前多少行的数据这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。1.row_number() over()row_number()over(partition by col1 order by col2)表...

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况:

    1、要求取出按field1分组后,并在每组中按照field2排序;
    2、亦或更加要求取出1中已经分组排序好的前多少行的数据

    这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。
    1.row_number() over()
    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。 
    与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。


    2.rank() over()
    rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)


    3.dense_rank() over()
    dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。

    示例:
    如有表Test,数据如下
    SQL代码:   
    CREATEDATE ACCNO MONEY 
    2014/6/5 111 200 
    2014/6/4 111 600 
    2014/6/5 111 400 
    2014/6/6 111 300 
    2014/6/6 222 200 
    2014/6/5 222 800 
    2014/6/6 222 500 
    2014/6/7 222 100 
    2014/6/6 333 800 
    2014/6/7 333 500 
    2014/6/8 333 200 
    2014/6/9 333 0 

    比如要根据ACCNO分组,并且每组按照CREATEDATE排序,是组内排序,并不是所有的数据统一排序,
    用下列语句实现:

    Sql代码 
    select t.*,row_number() over(partition by accno order by createDate) row_number from Test t 

    查询结果如下:


    大家可以注意到ACCNO为111的记录有两个相同的CREATEDATE,用row_number函数,他们的组内计数是连续唯一的,但是如果用rank或者dense_rank函数,效果就不一样,

    如下:
    rank的sql:
    select t.*,rank() over(partition by accno order by createDate) rank from Test t 

    查询结果:



    可以发现相同CREATEDATE的两条记录是两个第2时接下来就是第4.

    dense_rank的sql:
    Sql代码 
    select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t 

    查询结果:



    可以发现相同CREATEDATE的两个字段是两个第2时接下来就是第3.

    项目中特殊的业务需求可能会要求用以上三个不同的函数,具体情况具体对待。


    再比如有时会要求分组排序后分别取出各组内前多少的数据记录,sql如下:
    Sql代码 
    select createDate,accno,money,row_number from (select t.*,row_number() over(partition by accno order by createDate) row_number from Test t) t1 where row_number<4 


    查询结果如下:

     


    作者:Orson 
    出处:http://www.cnblogs.com/java-class/ 

    展开全文
  • Oracle中的排序和排序函数的使用

    万次阅读 多人点赞 2019-03-30 23:30:22
    前排提示,下面的实例用到的hr.employees表是Oracle11g的orcl实例自带的表空间的表,不要说你没有~要是没有,你可能Oracle没装好,或者账号连查看这个表的权限都没有,你换个...普通SQL排序 Oracle本身对SQL有良好...

    参考地址:https://www.cnblogs.com/qiuting/p/7880500.html

    前排提示,下面的实例用到的hr.employees表是Oracle11g的orcl实例自带的表空间的表,不要说你没有~要是没有,你可能Oracle没装好,或者账号连查看这个表的权限都没有,你换个sysman等身份的账号进行登录,然后测试

     

    普通SQL排序

    Oracle本身对SQL有良好的支持,因此简单的排序,就可以使用order by子句

    select * from hr.employess order by salary ;

    排序后获得序号(row_num)

    如果要求是排序,然后还要有一个专门的列给这些结果标序号,怎么办?

    使用Oracle的rownum关键字和列名一起查询即可:

    select rownum as rank, e.*  from hr.employees e order by salary desc ;

    然而不能像上面直接这样查,会出现这种结果

    因为rownum的机制的问题

     

    正确的做法:嵌套一层子查询,先排序完,然后以这个排序好了的结果作为基表,再进行一次查询

    select rownum as rank, e.* from 
    (select * from hr.employees order by salary desc) e;

    这下就没问题了

     

     

    使用排序函数

    为什么使用排序函数?

    有了上面的rownum关键字为什么还要有排序函数呢?请看上面的运行结果

    应用场景考虑

    排序的场景要考虑如下:

    值不同的情况下:这个是最完美的情况了,现实肯定不可能。

    有相同的值:按先来后到,这在一些比赛可能可以;或者并列第几,这个在成绩排名中是肯定的,不然分数一样,我凭什么我第二他第一,这个时候就只能使用Oracle的排序函数了

    row_number()函数

    row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

    row_number的简单使用

    语法

    select 别名.*, row_number() over(order by 子句 ) from 表名 别名;

    实例

    select e.*, row_number() over ( order by e.salary desc ) as rank from  hr.employees e ;

    上面查看Oracle自带的雇员表中的员工按工资降序排序,但是以然不能解决我们需要并列排名的问题

    row_number的分组排序

    语法

    select 别名.*, row_number() over(partition by 别名.排序字段 order by 子句 ) from 表名 别名;

    实际操作

    简单按工资降序别的也可以,那么你可以分组排序吗?例如我查看不同部们的人在他们自己的部门的工资排序,怎么写?

    select e.*, row_number() over (partition by e.department_id order by e.salary desc ) as rank from  hr.employees e ;
    

    加入了partiton by 通过哪个字段进行分组,然后排序,然而依然没有解决并列排名的问题!

    rank()函数-主要解决over子句排序字段值相同的情况

    rank函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。

    rank()的简单使用

    语法

    select 别名.*, rank() over(order by 子句 ) from 表名 别名;

    实例

    select e.*, rank() over ( order by e.salary desc ) as rank from  hr.employees e ;

    上面的sql语句不但进行了排序,而且对字段值相同的情况做出了排序相同的处理,然而,却是1224的尴尬局面

    rank的分组

    rank的分组和row_number的分组一样,在over子句中加入partition by子句即可

    语法

    select 别名.*, rank() over(partition by 别名.分组字段 order by 子句 ) from 表名 别名;

    实例

    select e.*, rank() over (partition by e.department_id order by e.salary desc ) as rank from  hr.employees e ;
    

     

    那么,有没有支持1223的排序函数呢?dense_rank函数!

     

    dense_rank函数

    dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。

    dense_rank的基本使用

    语法

    select 别名.*, dense_rank() over(order by 子句 ) from 表名 别名;

    实际操作

    select e.*, dense_rank() over ( order by e.salary desc ) as rank from  hr.employees e ;

     

    dense_rank的分组排序

    语法

    select 别名.*, rank() over(partition by 别名.分组字段 order by 子句 ) from 表名 别名;

    实际操作

    select e.*, dense_rank() over (partition by e.department_id order by e.salary desc ) as rank from  hr.employees e ;
    

     

     

     

    关于parttion by

      parttion by关键字是Oracle中分析性函数的一部分,用于给结果集进行分区。它和聚合函数Group by不同的地方在于它只是将原始数据进行名次排列,能够返回一个分组中的条记录(记录数不变),而Group by是对原始数据进行聚合统计,一般只有一条反映统计值的结果(每组返回一条)

     

    使用排序函数的时候,空值是最大的,如果排序字段为null, 可能造成null字段排在最前面,影响排序结果。可以这样:

    select 别名.*, row_number() over(partition by 别名.分组字段 order by 子句 nulls last) from 表名 别名;
    select 别名.*, rank() over(partition by 别名.分组字段 order by 子句 nulls last ) from 表名 别名;
    select 别名.*, dense_rank() over(partition by 别名.分组字段 order by 子句 nulls last ) from 表名 别名;

    或者在排序前进行空值处理都可以

    排序函数的使用注意

    1. 排名函数必须有 OVER 子句。
    2. 排名函数必须有包含 ORDER BY 的 OVER 子句。
    3. 分组内从1开始排序。

     

    总结

    不使用函数排序

    使用SQL自己的group by和order by子句等进行"排序" "分组和排序":

          比较麻烦,而且不能处理排序字段的值相同时的情况

    使用Oracle的rownum关键字+sql的排序:

         能够给查询的记录排序,并且给排序好的记录打上123这种序号,但也比较麻烦,需要在排序好的基础上再进行一次嵌套查询

    使用函数排序

    使用row_number函数:

               可以排序,还可以分组排序,写起来比普通的sql的简洁的多,而且可以给排序的字段加序号,缺点是也无法处理排序字段的值相同时的情况

    使用rank函数:

                有row_number一样的效果,语法也相近,能处理排序字段的值相同时的情况,但是却是1224的模式(即相同的序号后面的序号会被跳过,也可以理解为占用)

    使用dens_rank函数:

                有row_number一样的效果,语法也相近,能处理排序字段的值相同时的情况,是1223的模式(即相同的序号后面的序号不会跳过)

    三种函数的各自支持的模式的使用

    1234还是1223还是1224要看具体的应用场景,没有说哪个就最好

    要是1234是“先来后到”的规则的时候可以使用      假设是先到先得,那就算你成绩和我一样,你也不能有脾气

    1224是“名额或者资源有限的”情况下用     假设奖励排名是第一到第五,就五张奖状,只能12245了

    1223是“名额或资源充足”的时候用            假设奖励排名是第一到第五,奖状很多,就可以12222333344445555想怎么搞怎么搞

     

     

    总结(码字)不易,帮助到了你,给个赞~~~~~

     

      

    展开全文
  • 定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询,  比如查询前10个 查询10-100个学生。 实例: 1.1对学生成绩排序 &...

    1.ROW_NUMBER()

    定义:ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询, 
    比如查询前10个 查询10-100个学生。

    实例

    1.1对学生成绩排序

    这里写图片描述 
    这里number就是每个学生的序号 根据studentScore(分数)进行desc倒序

    1.2获取第二个同学的成绩信息

    这里写图片描述 
    这里用到的思想就是 分页查询的思想 在原sql外再套一层select 
    where t.number>=1 and t.number<=10 是不是就是获取前十个学生的成绩信息纳。

    2.RANK()

    定义:RANK()函数,顾名思义排名函数,可以对某一个字段进行排名,这里为什么和ROW_NUMBER()不一样那,ROW_NUMBER()是排序,当存在相同成绩的学生时,ROW_NUMBER()会依次进行排序,他们序号不相同,而Rank()则不一样出现相同的,他们的排名是一样的。下面看例子:

    2.1对学生成绩进行排名

    这里写图片描述

    这里发现 ROW_NUMBER()和RANK()怎么一样?因为学生成绩都不一样所以排名和排序一样,下面改一下就会发现区别。

    这里写图片描述

    当出现两个学生成绩相同是里面出现变化。RANK()是 1 2 2,而ROW_NUMBER()则还是1 2 3,这就是RANK()和ROW_NUMBER()的区别了

    3.DENSE_RANK()

    定义:DENSE_RANK()函数也是排名函数,和RANK()功能相似,也是对字段进行排名,那它和RANK()到底有什么不同那?看例子:

    实例

    这里写图片描述

    DENSE_RANK()密集的排名他和RANK()区别在于,排名的连续性,DENSE_RANK()排名是连续的,RANK()是跳跃的排名,所以一般情况下用的排名函数就是RANK()。

    4.NTILE()

    定义:NTILE()函数是将有序分区中的行分发到指定数目的组中,各个组有编号,编号从1开始,就像我们说的’分区’一样 ,分为几个区,一个区会有多少个。

    实例: 
    这里写图片描述

    这里查询了3次,第一次分为1个’区’ ,所以查询结果number全是1,第二次分为2个区,查询结果为 1 1 2,意思就是 第一个 ‘区’ 为 1 1 两个编号的数据 ,第二个’区’只有2这个数据。

    展开全文
  • 字符串排序需要转number才能排序 转number 的函数是to_number() select * from CMF_SALES_PARAMETER c where pmsn='SALES_KM' order by c.pmpc asc select * from CMF_SALES_PARAMETER c where pmsn='SALES_KM'...
  • Oracle排名函数

    千次阅读 2016-10-27 10:53:17
    select * from chenhf_20161027_01; select a.*,rownum from chenhf_20161027_01 a order by 个人年度最高分 rownum在order by之前...row_number()函数 相同的值会出现排名递增的情况; select a.*,row_number()ove
  • Oracle–开窗函数函数排序rank、desc_rank、row_number rank() over([partition by par_col] order by order_col):相同数据并列排序并且会跳过并列的应该有的次序 select salary,rank() over(order by salary desc) ...
  • 排序是非常常见的数据处理需求,Oracle中也有很多排序的方法,下面一起看看吧。 1、row_number实现分组排序后按序号取值 select * from ( SELECT ROW_NUMBER() over(partition by user_id order by calltime...
  • Oracle decode函数实现杂乱数据排序

    千次阅读 2018-01-26 19:13:46
    需求有时我们从数据库中...我们需要对现有的数据进行排序实现对现有的数据进行排序,使用到了Oracle的decode()函数decode()函数decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)该函数的含义如下:IF 条件=
  • 项目开发中的分组排序...如下有三个函数可以根据需求选择使用,这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。1.row_number() over()row_number()over(partition by col1 order by c...
  • oracle的几个排序函数

    千次阅读 2009-12-09 16:18:00
    rank 根据order by排名 会出现并列排名。下一个值会跳过并列值 比如 1 2 2 4 5...不会出现并列排名 1 2 3 4 5这三个分析函数都可以在各个分组内从1开始排序。ROW_NUMBER()是没有重复值的,可以利用它实现分页显示。DENS
  • Oracle函数之LISTAGG

    2020-12-14 23:53:24
    近在学习的过程中,发现一个挺有意思的函数,它可实现对列值的拼接。下面我们来看看其具体用法。  用法:  对其作用,官方文档的解释如下:  For a specified measure, LISTAGG orders data within each ...
  • --已知:两种排名方式(分区和不...--两种计算方式(连续,不连续),对应函数:dense_rank,rank   ·查询原始数据:学号,姓名,科目名,成绩 select * from t_score S_ID S_NAME SUB_NAME SCORE 1 张三
  • 遇到问题:sum聚合某数值字段并用row_number排序后,空值排序第一,如何剔除空值让最大值排第一? ...*配合的排序函数 row_number() over(patition by 分组字段 order by nvl(sum(a.金额),0)) ...
  • Oracle 常用 group by 来进行分组查询,但这里使用row_number()over(partition by 字段1 order by 字段2 ),字段1表示根据此字段分组,字段2表示排序,此函数计算的值就表示每组内部排序后的顺序编号。 With t1 as...
  • 主要介绍了Oracle用decode函数或CASE-WHEN实现自定义排序功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Oracle常用函数总结

    千次阅读 多人点赞 2018-04-30 16:48:03
    Oracle常用函数 今天主要总结一下oracle在查询时常用到相关的函数,使用一定的函数可以大大节省我们的工作时间,尽快的查询统计到我们想要的结果,废话不多说,下面开始介绍总结的内容和使用方法。 首先讲一下sql...
  • OracleOracle分析函数详解

    千次阅读 2019-05-25 22:45:09
    Oracle数据库中的函数有多种,比如单行函数、聚合函数、对象引用函数、模型函数、OLAP函数等。本篇将详细介绍Oracle数据库中的分析函数。 一 分析函数概述 所谓分析函数,是基于一组数据行计算聚合值,其与聚合...
  • oracle中分组排序函数用法

    千次阅读 2016-08-30 17:08:05
    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1...这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。 a、row_number() over() row_number()over(partition by col1 order b
  • 今天是2019年第一天,在此祝大家新年快乐,梦想还在路上,让我们继续加油! 应之前的计划,今天完成这篇记录,也借此记录自己...rank() 是排名的函数,该函数组内排序后会进行跳号,分数相同的作为并列。 dense_rank()
  • oracle排序函数

    千次阅读 2011-11-16 10:40:14
    oracle函数:  1、  rank() over() --> 不连续排序(1,2,3,3,5)  dense() over() --> 连续排序(1,2,3,3,4)  row_number() over() --> rownum排序(1,2,3,4,5)  2、  rank() ove
  • Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数group的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。 例如需要查询员工信息中每个部门最早入职员工的个人...
  • Oracle函数很多,在这里整理一下,方便使用。 Oracle数值型函数 Oracle字符型函数 Oracle日期函数 Oracle转换函数 Oracle聚组函数 Oracle其他函数 分析函数oracle分析函数--SQL*PLUS环境 一、总体...
  • Oracle分析函数汇总(超全)

    万次阅读 2019-09-13 11:13:28
    前半部分数据源为Oracle自带HR用户下的员工信息表:EMPLOYEES,若创建库的时候未勾选创建示例,可以在这下载sql文件,创建相关表及数据源。(百度网盘链接:https://pan.baidu.com/s/1axlyRjfEGi0pOi8xmRewrA 密码:...
  • 概述 ORACLE函数系列: Oracle常见函数大全 Oracle-分析函数之连续求和sum(…) over(…) ...Oracle-分析函数排序值rank()和dense_rank() Oracle-分析函数排序后顺序号row_number() Oracle-分...
  • oracle高级操作:分支判断函数,集合操作,排序函数,聚合函数……
  • oracle 高级函数

    千次阅读 多人点赞 2017-08-17 16:44:19
    工作两年了,一直使用的oracle,最近经常使用不常用的sql语句,索性就自己整理一下,发出来 供大家参考,后续会不断添加、整理,本文章不做详细的功能解释,主要集合描述目前接触过的一些函数 复制表结构和数据 ...
  • 最好能解释下months_between(函数)的源码是怎么操作的 public class Months_between { /** * 计算两个日期相差的月份数 * * @param date1 日期1 * @param date2 日期2 * @param pattern 日期1和日期2的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,145
精华内容 34,058
关键字:

oracle排序函数