在泡坛子的时候中无意中发现了这个函数,才知道oracle分析函数是如此的强大,其中over() 函数的用法又尤为的特别,所以将自己的研究结果记录一下。
个人理解:over() 函数 是对 分析函数的一种条件解释,直接点就是 给分析函数加条件吧。
在网上看见比较常用的就是 与 sum()、rank() 函数使用。接下来就用分析下两种函数结合over的用法。
以下测试使用的orace默认的 scott用户下的emp表数据。
1.sum()结合over()
select a.empno as 员工编号
,a.ename as 员工姓名
,a.deptno as 部门编号
,a.sal as 薪酬
,sum(sal) over (partition by deptno) 按部门求薪酬总和
from scott.emp a;
此段sql 执行的结果为:
部门编号 |
员工姓名 |
员工编码 |
薪酬 |
按部门求薪酬总和 |
7934 |
MILLER |
10 |
1300 |
8750 |
7782 |
CLARK |
10 |
2450 |
8750 |
7839 |
KING |
10 |
5000 |
8750 |
7369 |
SMITH |
20 |
800 |
10875 |
7876 |
ADAMS |
20 |
1100 |
10875 |
7566 |
JONES |
20 |
2975 |
10875 |
7788 |
SCOTT |
20 |
3000 |
10875 |
7902 |
FORD |
20 |
3000 |
10875 |
7900 |
JAMES |
30 |
950 |
9400 |
7654 |
MARTIN |
30 |
1250 |
9400 |
7521 |
WARD |
30 |
1250 |
9400 |
7844 |
TURNER |
30 |
1500 |
9400 |
7499 |
ALLEN |
30 |
1600 |
9400 |
7698 |
BLAKE |
30 |
2850 |
9400 |
可以从结果上看到sum()函数对部门区分进行了求和统计。其中“partition by”官方点的说法叫做"分区",其实就是统计的范围条件。
下面在给把上面的sql语句改造下 给 over() 函数加上 “order by sal” 会看到一个更过瘾的效果:
select a.empno as 员工编号
,a.ename as 员工姓名
,a.deptno as 部门编号
,a.sal as 薪酬
,sum(sal) over (partition by deptno) 按部门求薪酬总和
,sum(sal) over (partition by deptno order by sal) 按部门累计薪酬
from scott.emp a;
结果为:
部门编号 |
员工姓名 |
员工编码 |
薪酬 |
按部门求薪酬总和 |
按部门累计薪酬 |
7934 |
MILLER |
10 |
1300 |
8750 |
1300 |
7782 |
CLARK |
10 |
2450 |
8750 |
3750 |
7839 |
KING |
10 |
5000 |
8750 |
8750 |
7369 |
SMITH |
20 |
800 |
10875 |
800 |
7876 |
ADAMS |
20 |
1100 |
10875 |
1900 |
7566 |
JONES |
20 |
2975 |
10875 |
4875 |
7788 |
SCOTT |
20 |
3000 |
10875 |
10875 |
7902 |
FORD |
20 |
3000 |
10875 |
10875 |
7900 |
JAMES |
30 |
950 |
9400 |
950 |
7654 |
MARTIN |
30 |
1250 |
9400 |
3450 |
7521 |
WARD |
30 |
1250 |
9400 |
3450 |
7844 |
TURNER |
30 |
1500 |
9400 |
4950 |
7499 |
ALLEN |
30 |
1600 |
9400 |
6550 |
7698 |
BLAKE |
30 |
2850 |
9400 |
9400 |
从结果中可以看的 加了 “order by”后对 统计进行一个累加,这里个人理解为对统计范围规定了个统计顺利,一步一步的统计。
注:此sql语句结尾处不要加“order by”,应为使用的分析函数的(partition by deptno order by sal)
里已经有排序的语句了,如果再在句尾添加排序子句,一致倒罢了,不一致,结果就令人费解了。
2.rank()结合over()
rank函数是分级函数,这个函数必须与 over 函数使用,否则会报一个"缺少窗口函数的错"。我测试sql如下:
select a.empno as 员工编号,
a.sal as 薪资,
a.job as 岗位,
rank() OVER(partition by a.job ORDER BY a.sal desc) as 岗位薪资等级
from scott.emp a;
查询结果为:
员工编号 |
薪资 |
岗位 |
等级 |
7902 |
3000 |
ANALYST |
1 |
7788 |
3000 |
ANALYST |
1 |
7934 |
1300 |
CLERK |
1 |
7876 |
1100 |
CLERK |
2 |
7900 |
950 |
CLERK |
3 |
7369 |
800 |
CLERK |
4 |
7566 |
2975 |
MANAGER |
1 |
7698 |
2850 |
MANAGER |
2 |
7782 |
2450 |
MANAGER |
3 |
7839 |
5000 |
PRESIDENT |
1 |
7499 |
1600 |
SALESMAN |
1 |
7844 |
1500 |
SALESMAN |
2 |
7654 |
1250 |
SALESMAN |
3 |
7521 |
1250 |
SALESMAN |
3 |
分享到:
相关推荐
ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧
ORACLE中OVER函数的用法.doc
在Oracle数据库中,OVER函数是用于实现窗口函数(Window Functions)的重要组成部分。窗口函数允许我们执行更复杂的数据分析操作,如计算累计总和、排名等。这在开发报表时非常有用,能够让我们在查询结果中直接进行...
### Oracle开发中的OVER函数详解 #### 一、Oracle分析函数简介 在Oracle数据库开发中,分析函数是一类非常强大的工具,主要用于实现复杂的查询需求,尤其是在处理大量数据时,能够提供高级的数据汇总、排序和筛选...
在这个例子中,我们使用`RANK()`函数并结合`OVER`子句中的`PARTITION BY`来为每个班级的学生分数排名。可以看到,对于每个班级,分数最高的学生会被赋予排名1。 ##### 示例2:计算累积销售额 ```sql SELECT DATE, ...
本文将详细介绍Oracle中的`OVER`子句以及几种常用的开窗函数,包括`ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`和`LAG()`等。 #### 二、基本概念 - **`OVER`子句**:`OVER`子句用于指定分析函数的作用范围,它可以...
### Oracle中OVER函数详解 #### 一、概述 在Oracle数据库中,OVER函数是一个非常强大的工具,主要用于实现复杂的窗口函数操作。它可以帮助我们对数据进行分组、排序、累计等多种处理,大大增强了SQL语言的数据分析...
1. 作为分析函数,类似于 row_number()、rank()、dense_rank() 等函数,使用方法相似: LISTAGG(合并字段, 连接符) WITHIN GROUP(ORDER BY 合并字段的排序) OVER(PARTITION BY 分组字段) 2. 作为聚合函数,类似于 ...
Oracle查询中的`OVER (PARTITION BY ..)`是一个窗口函数,它允许我们在数据集上执行计算,但不是在整个结果集上,而是针对每个分区。这部分功能非常强大,可以用于复杂的分析和排序任务,尤其是在处理分组数据时。在...
Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...
Oracle分析函数是数据库管理系统Oracle中的一种高级查询工具,它们用于处理行集,计算基于特定窗口内的数据的聚合值。分析函数的主要特点是返回的结果不仅仅是一行,而是多行,这与传统的聚合函数(如SUM, AVG等)...
根据提供的文件信息,我们可以深入探讨Oracle分析函数的相关知识点,特别是`SUM()`函数配合`OVER`子句的不同用法,以及`RANK()`, `DENSE_RANK()`, 和 `ROW_NUMBER()` 这三个窗口函数的应用场景。 ### Oracle分析...
在Oracle 9i 分析函数参考手册中,你可能会找到详细的函数用法、示例和最佳实践,帮助你更有效地利用这些功能。手册通常会涵盖函数语法、参数、返回类型以及如何解决常见问题。通过深入学习和实践,你可以掌握如何在...
通过本文的学习,我们了解了Oracle中的分析函数及其基本用法,包括常见的分析函数分类、基本语法以及实际应用场景。这些函数的强大之处在于它们能够轻松地处理复杂的数据计算需求,为数据分析提供了极大的便利。掌握...
本资源摘要信息主要介绍了SYBASE iq和ORACLE中使用分析函数计算同期值和常用计算函数的使用方法。文章涵盖了同期值的计算、累计及同期累计值的计算、TOP 排序、日期转换格式、返回指定小数点位数、转换函数、大小写...
通过上述介绍,我们不仅了解了分析函数的基本用法,还探讨了如何利用开窗函数来定义不同类型的计算窗口,从而实现更高级的数据分析需求。掌握了这些技巧后,您可以更加高效地进行数据探索和洞察发现。
在Oracle数据库中,分析函数和聚合函数是SQL查询中用于处理和汇总数据的重要工具。本文将详细介绍两者的主要功能和用法。 首先,我们关注的是排名函数。在Oracle中,有三种常用的排名函数: 1. `RANK()`: 这个函数...
在描述中提到的场景中,有几种不同的方法可以实现数据统计,包括通过程序处理、使用临时表和包、标准SQL的UNION以及Oracle特有的分析函数。每种方法都有其优缺点。例如,程序处理方法与数据库无关,但增加了开发工作...
下面我们将详细讨论`ROW_NUMBER() OVER()`的使用方法及其在不同场景下的应用。 首先,`ROW_NUMBER() OVER()`的基本语法是: ```sql ROW_NUMBER() OVER ( [PARTITION BY column1, column2, ...] ORDER BY column3...
#### 三、OVER (PARTITION BY ..) 的使用方法 ##### 1. 分区概述 `OVER (PARTITION BY ...)` 的主要作用是定义一个分区集合,即对数据进行分组,然后在每个分区内执行相应的操作。例如,在以下示例中,我们根据 `...