oracle 分组排序函数
项目开发中,我们有时会碰到需要分组排序来解决问题的情况:
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
查询结果如下:

oracle 分组排序函数的更多相关文章
- oracle中分组排序函数用法 - 转
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
- Oracle 高级排序函数 和 高级分组函数
高级排序函数: [ ROW_NUMBER()| RANK() | DENSE_RANK ] OVER (partition by xx order by xx) 1.row_number() 连续且递 ...
- 分组排序函数——row_number()
1.MySQL8.0以上版本 用法1:无分组排序 Row_number() OVER(ORDER BY 字段 DESC)例如:Row_number() OVER(ORDER BY 学生成绩 DESC) ...
- Oracle随机排序函数和行数字段
随机排序函数dbms_random.value()用法:select * from tablename order by dbms_random.value() 行数字段rownum用法:select ...
- mssql sqlserver 分组排序函数row_number、rank、dense_rank用法简介及说明
在实际的项目开发中,我们经常使用分组函数,对组内数据进行群组后,然后进行组内排序:如:1:取出一个客户一段时间内,最大订单数的行记录2: 取出一个客户一段时间内,最后一次销售记录的行记录——————— ...
- 关于oracle分组排序取值的问题
按照 某字段分组 某字段排序 然后取出该分组中排第1条数据(每组只取一条) SELECT* FROM( SELECT a.*,row_number() over(partition by ORI_FE ...
- Oracle分组排序查询
用sql查询每个分组中amount最大的前两条记录: SELECT *FROM HW trWHERE(SELECT COUNT(*) FROM HW WHERE tr.DEPID=DEPID AND ...
- hive 分组排序函数 row_number() over(partition by " " order by " "desc
语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...
- oracle 分组排序
SELECT * FROM (SELECT A.*, RANK() OVER(PARTITION BY A.DR_ATP_ID, A.AT_CODE ORDER BY A.KEY_CODE) RANK ...
随机推荐
- sql server使用中遇到的问题记录
一.sql server 不能连接远程服务器,但可以连接本地的数据库 我目前用的是sql server 2012 sp1,用着用着突然就不能连接远程服务器上的数据库了,崩溃了一天... 修复试了,卸载 ...
- Hadoop生态圈以及各组成部分的简介
1.Hadoop是什么? 适合大数据的分布式存储与计算平台 HDFS: Hadoop Distributed File System分布式文件系统 MapReduce:并行计算框架 解决的问题: HD ...
- 烂泥:CentOS命令学习之scp复制
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 由于工作需要,需要把服务器A上的文件弄一份到服务器B上.自己比较懒不打算搭建FTP.Samba服务器,所以就打算使用scp命令,scp命令是通过ssh协 ...
- day 2 Linux目录结构
Linux系统的目录结构的基本介绍: 1)在逻辑上的所有目录(包括目录下的子目录)都在最高级别的目录“/”下. 根(/)目录是Linux系统中所有目录的起始点(顶点),根下面的目录及子目录是一个有层次 ...
- C# 计算文件MD5
因工作需要对文件进行是否被修改判断,整理的一段生成文件MD5码的代码: 1: public class FileHelper 2: { 3: /// <summary> 4: /// 对文 ...
- 加快FineReport报表设计的几个心得体会
加快FineReport报表设计的几个心得体会 一.从远程服务器大批量取数进行表样设计时,最好按“列顺序”取一个“空的SQL语句”,这样可提高设计速度.否则每次设计时模板均要从远程读取数据,速度相当慢 ...
- 贤者时间太久了么?--MySQL继续玩
hi 给自己放了大概三天的假,没有一点点防备,没有一点点准备,无意的 是不是贤者时间过不去了我不知道啊...继续看东西吧 1.MySQL -----运算符和函数----- 字符函数,数值运算符,比较运 ...
- ajax小结
1. http是一种无状态协议 2. http请求:四部分组成 ① http 请求的方法或动作,如:GET / POST ② 正在请求的URL,总得知道请求的地址是什么 ③ 请求头,包含一些客户端环境 ...
- 基于内容产品的MVP探索
王凯:凯叔讲故事的创始人 1.精益创业有以下3个过程: ——假设:价值假设和增长假设 ——认知:验证认知 ——行动:MVP(最小化可行产品) 2.互联网时代内容该如何定价: ——对于一家初创公司,最重 ...
- Caffe 抽取CNN网络特征 Python
Caffe Python特征抽取 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ Caffe大家一般用到的深度学 ...