项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1、要求取出按field1分组后,并在每组中按照field2排序;2、亦或更加要求取出1中已经分组排序好的前多少行的数据
这里通过一张表的示例和SQL语句阐述下oracle数据库中用于分组排序函数的用法。
a、row_number() over()
row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)。
b、rank() over()
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
c、dense_rank() over()
dense_rank()也是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的。
示例:
如有表Test,数据如下
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排序,是组内排序,并不是所有的数据统一排序,
用下列语句实现:
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:
select t.*,dense_rank() over(partition by accno order by createDate) dense_rank from Test t
查询结果:
可以发现相同CREATEDATE的两个字段是两个第2时接下来就是第3.
项目中特殊的业务需求可能会要求用以上三个不同的函数,具体情况具体对待。
再比如有时会要求分组排序后分别取出各组内前多少的数据记录,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
查询结果如下:
相关推荐
oracle如何实现分组排序和统计、聚集,如何分组求top N,什么是over分析函数,row_number(),rank(),dense_rank()区别又是什么, 如何找到一条记录的前后值,这份文档写得太好了。
近在学习的过程中,发现一个挺有意思的函数,它可实现对列值的拼接。下面我们来看看其具体用法。 用法: 对其作用,官方文档的解释如下: For a specified measure, LISTAGG orders data within each ...
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码。 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开始...
12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个查询依赖于另一个查询时 13.1 高级子查询 13.1.1 相关子查询 13.1.2 并列的逻辑测试 13.1.3 EXISTS及其相关子查询的使用 13.2 外部...
12.4.3 对列和分组函数进行排序 12.4.4 连接列 12.5 更多分组可能性 第13章 当一个查询依赖于另一个查询时 13.1 高级子查询 13.1.1 相关子查询 13.1.2 并列的逻辑测试 13.1.3 EXISTS及其相关子查询的使用 13.2 外部...
4.6 函数:字符串函数、数字函数和聚集函数(不是分组) 91 4.6.1 字符串函数 91 4.6.2 数字函数 92 4.6.3 聚集函数 92 4.7 日期函数(格式化的和按时间排列的) 93 4.7.1 日期函数 93 4.7.2 特殊格式的日期数据...
有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。 JARED STILL 从1994年就开始使用...
第五章:分组函数 第六章:数据限定和排序 第七章:复杂查询(上):多表连接技术 第八章:复杂查询(下):子查询 第二部分:用户及数据库对象 第九章:用户访问控制 第十章:Oracle的事务和锁 第十一章:...
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...
(1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验...
4.6 函数:字符串函数、数字函数和聚集函数(不是分组) 4.6.1 字符串函数 4.6.2 数字函数 4.6.3 聚集函数 4.7 日期函数(格式化的和按时间排列的) 4.7.1 日期函数 4.7.2 特殊格式的日期数据类型 4.7.3 嵌套函数 ...
10.1 描述和使用SQL中的字符、数字和日期函数 348 10.1.1 定义函数 348 10.1.2 函数类型 348 10.1.3 使用大小写转换函数 349 10.1.4 使用字符操作函数 350 10.1.5 使用数字函数 353 10.1.6 使用日期 355 ...
下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_...
§2.2 SQL中的单记录函数 50 §2.2.1 单记录字符函数 50 §2.2.2 单记录数字函数 56 §2.2.3 单记录日期函数 62 §2.2.4 单记录转换函数 65 §2.2.5 其它的单记录函数 68 §2.3 SQL中的组函数 73 §2.3.1 多记录组...
是第3名 LAG 表示 分组排序后 ,组内后面一条记录减前面一条记录的差,第一条可返回 NULL BTW: EXPERT ONE ON ONE 上讲的最详细,还有很多相关特性,文档看起来比较费劲 row_number()和rownum差不多,功能更强一点...
1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程。 2.标准的SQL语言语句类型可以分为:数据定义语句(DDL)、数据操纵语句(DML)和数据控制语句(DCL)。 3.在需要滤除查询结果中重复的行时,必须...
实验11:使用order by子句来进行排序操作 20 实验12:操作字符串的函数 22 实验13:操作数字的函数 25 实验14:操作日期的函数 25 实验15:操作数据为null的函数 31 实验16:分支的函数 32 实验17:分组统计函数 33 ...