`
xm_koma
  • 浏览: 384786 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle中分组排序函数用法

阅读更多

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

  

 

查询结果如下:



 

 

  • 大小: 4 KB
  • 大小: 3.8 KB
  • 大小: 3.9 KB
  • 大小: 3.2 KB
分享到:
评论

相关推荐

    oracle分组排序统计高级用法

    #### 一、Oracle分组排序和统计概述 在Oracle数据库中,实现分组排序和统计是一项常见的需求,主要用于处理大量的数据,并从中提取有价值的信息。通过合理运用SQL语句,特别是`GROUP BY`、`ORDER BY`以及分析函数等...

    oracle最常用的函数或方法总结

    6. **分组和排序函数** - `GROUP BY`:根据一个或多个列对数据进行分组。 - `ORDER BY`:对结果集进行排序。 - `RANK()`, `DENSE_RANK()` 和 `ROW_NUMBER()`:在分组后为每行分配唯一的排名。 7. **连接查询函数...

    【Oracle】LISTAGG函数的使用.pdf

    Oracle LISTAGG 函数是 Oracle 11.2 中引入的一种新特性,主要功能类似于 wmsys.wm_concat 函数,即将数据分组后,把指定列的数据再通过指定符号合并。LISTAGG 函数有两个参数:要合并的列名和自定义连接符号。 ...

    oracle开窗函数学习技巧总结

    开窗函数允许我们在查询结果集的一个窗口内执行聚合操作,而无需对数据进行物理排序或分组。本文将重点介绍`OVER`函数及其相关用法,并通过具体的例子来帮助读者更好地理解和掌握这些技巧。 #### 二、`OVER`函数...

    oracle分析函数(用法+实例)

    Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...

    Oracle中分组后拼接分组字符串[文].pdf

    Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接...本文介绍了如何在 Oracle 中使用 `sys_connect_by_path` 函数与 `start` 递归实现分组后拼接分组字符串。该方法可以应用于各种数据分析和报表生成场景。

    oracle函数大全(分类成9个word文档)

    4. "oracle函数介绍(5) 分析函数简述.doc":分析函数,如RANK()、ROW_NUMBER()和LEAD/LAG(),在处理分组数据时非常有用,可以提供行级别的排序和计算。 5. "oracle函数介绍(6) 著名函数之分析函数.doc"和"oracle...

    oracle分析函数及开窗函数

    通过本文的学习,我们了解了Oracle中的分析函数及其基本用法,包括常见的分析函数分类、基本语法以及实际应用场景。这些函数的强大之处在于它们能够轻松地处理复杂的数据计算需求,为数据分析提供了极大的便利。掌握...

    Oracle_详解分析函数

    ### Oracle分析函数详解 #### 一、Oracle分析函数概述 Oracle分析函数是在处理大量数据时进行高级数据分析的强大工具,主要用于在线分析处理(OLAP)场景...希望本文能够帮助您更好地掌握Oracle分析函数的使用方法。

    Oracle函数大全-详细介绍.rar

    分析函数是Oracle中的一个重要特性,它们允许在分组或排序的数据集上进行计算。比如,`RANK()`和`DENSE_RANK()`为每个组内的行分配唯一的排名,`LEAD()`和`LAG()`可以访问当前行的前后行数据,`ROW_NUMBER()`为每行...

    oracle sql内置函数大全

    Oracle SQL内置函数是数据库管理、查询和数据分析中的关键工具,它们极大地增强了SQL语言的功能和...在《Oracle SQL function.ppt》这个文件中,可能包含了更详细的函数介绍、示例和使用技巧,建议查阅以获取更多信息。

    oracle 9i 分析函数参考手册.rar

    在Oracle 9i 分析函数参考手册中,你可能会找到详细的函数用法、示例和最佳实践,帮助你更有效地利用这些功能。手册通常会涵盖函数语法、参数、返回类型以及如何解决常见问题。通过深入学习和实践,你可以掌握如何在...

    oracle函数大全(分类显示).zip_Oracle 函数分类_oracle_oracle函数分类_oracle函数查阅用文档

    通过这份"oracle函数大全(分类显示).chm"文档,你可以详细了解到每个函数的具体用法、参数和返回值,从而更好地理解和应用到实际的数据库操作中。随着对Oracle的理解加深,你会发现这些函数能极大地提高你的数据库...

    oracle 中的分析函数

    本文将详细介绍Oracle 8i中引入的部分分析函数及其用法,通过具体的例子帮助读者更好地理解和应用这些功能。 #### 分析函数的目的与优势 虽然标准SQL也可以实现相同的功能,但使用分析函数的优势包括: - **简化...

    oracle 内置函数大全

    Oracle数据库系统是世界上最广泛使用的...在"oracle内置函数大全.sql"文件中,可能包含了所有这些函数的示例和用法,供用户参考和实践。通过深入研究这个文件,可以深入了解Oracle SQL的功能,并提升数据库管理技能。

    Oracle函数速查手册

    "Oracle函数速查手册"中详尽列举了这些函数的用法和示例,便于查阅和学习。通过深入研究这个文档,用户不仅可以快速查找所需函数,还能深入理解Oracle数据库的强大功能,从而提升数据库管理与开发的技能。

    Oracle中Decode()函数使用技巧

    Decode()函数也可用于GROUP BY、HAVING和ORDER BY子句中,帮助对分组或排序进行条件判断。例如: ``` SELECT DECODE(column, 'value1', 'group1', 'value2', 'group2', 'other') AS group_name, COUNT(*) FROM ...

    oracle函数大全.rar

    `oracle函数大全.doc`很可能是一个详细的文档,涵盖了Oracle数据库中各种内置函数的用法、语法和示例。这份文档可能会包括以下几大类函数: 1. **数学函数**:如ROUND、TRUNC、MOD等,用于对数字进行四舍五入、截断...

    ORACLE 分析函数大全

    在实际应用中,掌握这些分析函数的用法对于优化查询性能、提高数据分析效率至关重要。通过熟练运用分析函数,你可以编写出能够处理大量数据并返回深度洞察的SQL查询,这对于任何涉及大数据处理和报表生成的IT专业...

    ORACLE分析函数

    ### 排序函数的使用场景 #### RANK() `RANK()`函数为每一行分配一个唯一的排名号,相同值的行将被分配相同的排名,但下一行的排名将跳过与相同值行的数量相等的数字。 #### DENSE_RANK() `DENSE_RANK()`函数同样为...

Global site tag (gtag.js) - Google Analytics