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

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排序,是组内排序,并不是所有的数据统一排序,

用下列语句实现:

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:

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. 如何根据字典中值的大小,对字典中的项排序

    如何根据字典中值的大小,对字典中的项排序 sorted(dict2.iteritems(),key=lambda item:item[1],reverse=True) 使用内置函数sorted  1. ...

  2. mac电脑怎样修改cad标注尺寸中的数字大小?

    安装完CAD后,在使用过程中你发现尺寸标注中的数字太小,想要看清标注尺寸的话需要放大图纸才可以,对于我们的工作而言就会很繁琐,如果此时你也想要将数字字号调大些,却又不知如何操作?快来跟小编学习一下吧! ...

  3. php 取字符串中的字母数字,php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码)...

    本篇文章给大家带来的内容是关于php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. PHP提取字符串中的第一组数字 ...

  4. python3提取字符串中的数字_如何在Python中从字符串中提取数字?

    14 回复 | 直到 1 年前 1 430 3 年前 如果只想提取正整数,请尝试以下操作: >>> str = "h3110 23 cat 444.4 rabbit 11 ...

  5. 假想面试题:现在有一串字符串2, 2, 3……,其中字符串中的数字类似于Word文档中的标题级别,最终效果是让它们按照Word文档导航窗格中的标题级别格式进行展示

    目录 一.问题 二.答案 1.依赖 2.代码 3.结果 4.思路分析 三.拓展 1.反向思维 2.引用数据类型 四.实战 1.背景 2.实战模拟 2.1.代码 2.2.结果 一.问题 现在有一串字符串 ...

  6. python数字排序_python按照列表元素中的数字大小排序

    [Human Sorting] 常见的python排序只需要一个sort或者sorted函数即可.但是默认采用的是字典序,这会带来一个问题,如果列表中的元素是字符串+数字组合,往往无法得到我们想要的排 ...

  7. python数字大小排列_python按照列表元素中的数字大小排序

    [Human Sorting] 常见的python排序只需要一个sort或者sorted函数即可.但是默认采用的是字典序,这会带来一个问题,如果列表中的元素是字符串+数字组合,往往无法得到我们想要的排 ...

  8. Excel中按照数字和汉字列对所有列排序

    今天学医的一个同学发消息说他那大量的Excel的数据想按照数字和汉字那一列数据进行排序,但是不知道怎么操作,于是我就自己给他制作了了比较粗糙的操作教程,希望能够帮助到需要帮助的人吧.也欢迎有较好的方法 ...

  9. Hibernate三种状态;query查询;ResultTransformer转换为pojo对象;可以将query语句写在xml中;Criteria查询;ProjectionList总和/f分组等函数

    Session操作过程中的pojo对象存在三种状态: 1)  瞬时态:该对象在数据库中没有对应的数据 2)  持久态:数据库中存在该对象对应的数据,同时操作该对象的Session也存在. 3)  游离 ...

最新文章

  1. 用python解“12-24小时制”题
  2. 张亚勤:对于产业来讲,深度学习的黄金时代刚刚开始
  3. numpy 笔记: random模块
  4. Elastic Search 上市了,Slack上市了,我也要写个软件,走上人生巅峰
  5. 5 日期范围查询_MySQL(四)——复杂查询
  6. linux 读写时间变长,linux时钟变慢的原因分析【转】
  7. [渝粤教育] 西南财经大学 货币金融学 参考 资料
  8. firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码...
  9. Python的多行输入与多行输出
  10. 用java制作心理测试软件_Java 程序员必备的10款开源工具
  11. Vue 过滤器/watch/computed
  12. win10计算机内存,win10多大内存够用 win10系统需要多大的运行内存
  13. oj-杭电 熊猫阿波的故事
  14. 《码农翻身》原文分章节阅读链接
  15. 电路课组(一)电路原理 Review 1 线性电路分析基础
  16. 数据中台常用术语整理
  17. iOS Safari阅读模式分析过程
  18. Shell实战--文件安全性的保证
  19. Gitbook制作PDF电子书
  20. php中until的用法,until用法解析(完美篇)

热门文章

  1. Linux Shell脚本while和until循环
  2. Docker运行容器端口映射
  3. 深挖用户体验:如何评价用户体验的好与坏
  4. 计算机显示器外壳怎么防水,一种防水计算机显示器外壳
  5. 安鑫 一个普通女孩的奋斗史
  6. Curve fitting之matlab
  7. Android状态栏沉浸式模式读卡器多种技巧
  8. 强化学习-reward-shaping-好奇心驱动-调研
  9. 微信公众号广告平台服务器,微信公众号的与众不同,从第三方平台开始
  10. iOS基础 - NSString操作总结