项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如: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分组排序和统计概述 在Oracle数据库中,实现分组排序和统计是一项常见的需求,主要用于处理大量的数据,并从中提取有价值的信息。通过合理运用SQL语句,特别是`GROUP BY`、`ORDER BY`以及分析函数等...
6. **分组和排序函数** - `GROUP BY`:根据一个或多个列对数据进行分组。 - `ORDER BY`:对结果集进行排序。 - `RANK()`, `DENSE_RANK()` 和 `ROW_NUMBER()`:在分组后为每行分配唯一的排名。 7. **连接查询函数...
Oracle LISTAGG 函数是 Oracle 11.2 中引入的一种新特性,主要功能类似于 wmsys.wm_concat 函数,即将数据分组后,把指定列的数据再通过指定符号合并。LISTAGG 函数有两个参数:要合并的列名和自定义连接符号。 ...
开窗函数允许我们在查询结果集的一个窗口内执行聚合操作,而无需对数据进行物理排序或分组。本文将重点介绍`OVER`函数及其相关用法,并通过具体的例子来帮助读者更好地理解和掌握这些技巧。 #### 二、`OVER`函数...
Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...
Oracle 中分组后拼接分组字符串 在 Oracle 中,分组后拼接...本文介绍了如何在 Oracle 中使用 `sys_connect_by_path` 函数与 `start` 递归实现分组后拼接分组字符串。该方法可以应用于各种数据分析和报表生成场景。
4. "oracle函数介绍(5) 分析函数简述.doc":分析函数,如RANK()、ROW_NUMBER()和LEAD/LAG(),在处理分组数据时非常有用,可以提供行级别的排序和计算。 5. "oracle函数介绍(6) 著名函数之分析函数.doc"和"oracle...
通过本文的学习,我们了解了Oracle中的分析函数及其基本用法,包括常见的分析函数分类、基本语法以及实际应用场景。这些函数的强大之处在于它们能够轻松地处理复杂的数据计算需求,为数据分析提供了极大的便利。掌握...
分析函数是Oracle中的一个重要特性,它们允许在分组或排序的数据集上进行计算。比如,`RANK()`和`DENSE_RANK()`为每个组内的行分配唯一的排名,`LEAD()`和`LAG()`可以访问当前行的前后行数据,`ROW_NUMBER()`为每行...
Oracle SQL内置函数是数据库管理、查询和数据分析中的关键工具,它们极大地增强了SQL语言的功能和...在《Oracle SQL function.ppt》这个文件中,可能包含了更详细的函数介绍、示例和使用技巧,建议查阅以获取更多信息。
在Oracle 9i 分析函数参考手册中,你可能会找到详细的函数用法、示例和最佳实践,帮助你更有效地利用这些功能。手册通常会涵盖函数语法、参数、返回类型以及如何解决常见问题。通过深入学习和实践,你可以掌握如何在...
通过这份"oracle函数大全(分类显示).chm"文档,你可以详细了解到每个函数的具体用法、参数和返回值,从而更好地理解和应用到实际的数据库操作中。随着对Oracle的理解加深,你会发现这些函数能极大地提高你的数据库...
本文将详细介绍Oracle 8i中引入的部分分析函数及其用法,通过具体的例子帮助读者更好地理解和应用这些功能。 #### 分析函数的目的与优势 虽然标准SQL也可以实现相同的功能,但使用分析函数的优势包括: - **简化...
Oracle数据库系统是世界上最广泛使用的...在"oracle内置函数大全.sql"文件中,可能包含了所有这些函数的示例和用法,供用户参考和实践。通过深入研究这个文件,可以深入了解Oracle SQL的功能,并提升数据库管理技能。
"Oracle函数速查手册"中详尽列举了这些函数的用法和示例,便于查阅和学习。通过深入研究这个文档,用户不仅可以快速查找所需函数,还能深入理解Oracle数据库的强大功能,从而提升数据库管理与开发的技能。
Decode()函数也可用于GROUP BY、HAVING和ORDER BY子句中,帮助对分组或排序进行条件判断。例如: ``` SELECT DECODE(column, 'value1', 'group1', 'value2', 'group2', 'other') AS group_name, COUNT(*) FROM ...
`oracle函数大全.doc`很可能是一个详细的文档,涵盖了Oracle数据库中各种内置函数的用法、语法和示例。这份文档可能会包括以下几大类函数: 1. **数学函数**:如ROUND、TRUNC、MOD等,用于对数字进行四舍五入、截断...
在实际应用中,掌握这些分析函数的用法对于优化查询性能、提高数据分析效率至关重要。通过熟练运用分析函数,你可以编写出能够处理大量数据并返回深度洞察的SQL查询,这对于任何涉及大数据处理和报表生成的IT专业...
### 排序函数的使用场景 #### RANK() `RANK()`函数为每一行分配一个唯一的排名号,相同值的行将被分配相同的排名,但下一行的排名将跳过与相同值行的数量相等的数字。 #### DENSE_RANK() `DENSE_RANK()`函数同样为...