一、Oracle分析函数简介:
在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction
Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求;其次这些系统的业务逻辑一般比较复杂,可能需要经过多次的运
算。比如我们经常接触到的电子商城。
在这些系统之外,还有一种称之为OLAP的系统(即Online Aanalyse
Process),这些系统一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系在一起。这些系统的特点是数据量大,对实时响应的要求不
高或者根本不关注这方面的要求,以查询、统计操作为主。
我们来看看下面的几个典型例子:
①查找上一年度各个销售区域排名前10的员工
②按区域查找上一年度订单总额占区域订单总额20%以上的客户
③查找上一年度销售最差的部门所在的区域
④查找上一年度销售最好和最差的产品
我们看看上面的几个例子就可以感觉到这几个查询和我们日常遇到的查询有些不同,具体有:
①需要对同样的数据进行不同级别的聚合操作
②需要在表内将多条数据和同一条数据进行多次的比较
③需要在排序完的结果集上进行额外的过滤操作
二、Oracle分析函数简单实例:
下面我们通过一个实际的例子:按区域查找上一年度订单总额占区域订单总额20%以上的客户,来看看分析函数的应用。
【1】测试环境:
Name Null ? Type
-- --------------------- -------- ----------------
CUST_NBR NOT NULL NUMBER ( 5 )
REGION_ID NOT NULL NUMBER ( 5 )
SALESPERSON_ID NOT NULL NUMBER ( 5 )
YEAR NOT NULL NUMBER ( 4 )
MONTH NOT NULL NUMBER ( 2 )
TOT_ORDERS NOT NULL NUMBER ( 7 )
TOT_SALES NOT NULL NUMBER ( 11 , 2 )
【2】测试数据:
CUST_NBR REGION_ID SALESPERSON_ID
YEAR
MONTH
TOT_ORDERS TOT_SALES
--
-------- ---------- -------------- ---------- ---------- ---------- ----------
11
7
11
2001
7
2
12204
4
5
4
2001
10
2
37802
7
6
7
2001
2
3
3750
10
6
8
2001
1
2
21691
10
6
7
2001
2
3
42624
15
7
12
2000
5
6
24
12
7
9
2000
6
2
50658
1
5
2
2000
3
2
44494
1
5
1
2000
9
2
74864
2
5
4
2000
3
2
35060
2
5
4
2000
4
4
6454
2
5
1
2000
10
4
35580
4
5
4
2000
12
2
39190
13
rows selected.
【3】测试语句:
2
o.region_id region,
3
sum
(o.tot_sales) cust_sales,
4
sum
(
sum
(o.tot_sales))
over
(partition
by
o.region_id) region_sales
5
from
orders_tmp o
6
where
o.
year
=
2001
7
group
by
o.region_id, o.cust_nbr;
CUSTOMER REGION CUST_SALES REGION_SALES
--
-------- ---------- ---------- ------------
4
5
37802
37802
7
6
3750
68065
10
6
64315
68065
11
7
12204
12204
三、分析函数OVER解析:
请注意上面的绿色高亮部分,group
by的意图很明显:将数据按区域ID,客户进行分组,那么Over这一部分有什么用呢?假如我们只需要统计每个区域每个客户的订单总额,那么我们只需要
group by
o.region_id,o.cust_nbr就够了。但我们还想在每一行显示该客户所在区域的订单总额,这一点和前面的不同:需要在前面分组的基础上按
区域累加。很显然group by和sum是无法做到这一点的(因为聚集操作的级别不一样,前者是对一个客户,后者是对一批客户)。
这就是over函数的作用了!它的作用是告诉SQL引擎:按区域对数据进行分区,然后累积每个区域每个客户的订单总额(sum(sum(o.tot_sales)))。
现在我们已经知道2001年度每个客户及其对应区域的订单总额,那么下面就是筛选那些个人订单总额占到区域订单总额20%以上的大客户了
2
from
(
select
o.cust_nbr customer,
3
o.region_id region,
4
sum
(o.tot_sales) cust_sales,
5
sum
(
sum
(o.tot_sales))
over
(partition
by
o.region_id) region_sales
6
from
orders_tmp o
7
where
o.
year
=
2001
8
group
by
o.region_id, o.cust_nbr) all_sales
9
where
all_sales.cust_sales
>
all_sales.region_sales
*
0.2
;
CUSTOMER REGION CUST_SALES REGION_SALES
--
-------- ---------- ---------- ------------
4
5
37802
37802
10
6
64315
68065
11
7
12204
12204
SQL
>
现在我们已经知道这些大客户是谁了!哦,不过这还不够,如果我们想要知道每个大客户所占的订单比例呢?看看下面的SQL语句,只需要一个简单的Round函数就搞定了。
2
100
*
round
(cust_sales
/
region_sales,
2
)
||
'
%
'
Percent
3
from
(
select
o.cust_nbr customer,
4
o.region_id region,
5
sum
(o.tot_sales) cust_sales,
6
sum
(
sum
(o.tot_sales))
over
(partition
by
o.region_id) region_sales
7
from
orders_tmp o
8
where
o.
year
=
2001
9
group
by
o.region_id, o.cust_nbr) all_sales
10
where
all_sales.cust_sales
>
all_sales.region_sales
*
0.2
;
CUSTOMER REGION CUST_SALES REGION_SALES
PERCENT
--
-------- ---------- ---------- ------------ ----------------------------------------
4
5
37802
37802
100
%
10
6
64315
68065
94
%
11
7
12204
12204
100
%
SQL
>
总结:
①Over函数指明在那些字段上做分析,其内跟Partition by表示对数据进行分组。注意Partition by可以有多个字段。
②Over函数可以和其它聚集函数、分析函数搭配,起到不同的作用。例如这里的SUM,还有诸如Rank,Dense_rank等。
参考资料:《Mastering Oracle SQL》(By Alan Beaulieu
, Sanjay Mishra
O'Reilly June 2004 0-596-00632-2)
发表评论
-
Why Facebook Uses MySQL for Timeline
2011-12-16 22:28 697A little-known fact about Fac ... -
浅析Oracle中PGA和UGA两者间的区别
2011-09-30 12:01 1197初学Oracle时,你可能会 ... -
oracle decode()
2011-09-23 17:27 660decode(条件,值1,翻译值1,值2,翻译值2,...值n ... -
dba_segments
2011-09-20 10:19 9451、desc dba_segments 名称 ... -
Oracle表空间管理
2011-09-20 10:18 10002010-01-05 08:54 129人阅读 ... -
关于oracle 中的dmt_lmt_mssm_assm之间的关系
2011-09-16 11:46 1609在了解dmt和lmt之前,先来简单的熟悉一下oracle数 ... -
如果查看Oracle数据块和操作系统块大小
2011-09-14 11:21 40251、 在命令窗口中执行: SQL& ... -
深入了解Oracle SCN(3)
2011-09-09 10:49 705示例 例子背景:oracle ... -
深入了解Oracle SCN(2)
2011-09-09 10:48 704SCN 号与 oracle ... -
深入了解Oracle SCN(1)
2011-09-09 10:46 677[说明] 本来在研究Backup and R ... -
DBWn基础
2011-09-08 11:00 745DBWn基础 Database Writer (DBWn ... -
index skip scan的一些实验。
2011-09-05 16:00 845index skip scan的基本介绍。 表employe ... -
Oracle 绑定变量详解
2011-09-02 17:26 599之前整理过一篇有关绑 ... -
OLTP和OLAP
2011-09-01 11:55 594联机事务处理(OLTP)和联机分析处理(OLAP)的不同,主要 ... -
Oracle的优化器(Optimizer) (CBO优化) 分享
2011-09-01 10:56 720Oracle的优化器(Optimizer) ... -
oracle中的exists 和not exists 用法详解
2011-08-31 17:25 702有两个简单例子,以说明 “exists”和“in”的效率问 ...
相关推荐
1 Oracle开发专题之:分析函数 OVER 2 Oracle开发专题之:分析函数 Rank Dense rank row number 3 Oracle开发专题之:分析函数3 Top Bottom N First Last NTile 4 Oracle开发专题之:窗口函数 5 Oracle开发专题...
### Oracle开发中的OVER函数详解 #### 一、Oracle分析函数简介 在Oracle数据库开发中,分析函数是一类非常强大的工具,主要用于实现复杂的查询需求,尤其是在处理大量数据时,能够提供高级的数据汇总、排序和筛选...
Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。其中,Oracle的分析函数是其强大的特性之一...因此,对分析函数的深入理解是成为高级Oracle数据库开发人员的关键技能之一。
### Oracle分析函数OVER及开窗函数详解 #### 一、概述 在Oracle数据库中,分析函数(Analytic Functions)是一种非常强大的工具,用于处理复杂的查询需求。这些函数可以在一组相关的行上执行计算,并且每行返回一个...
通过本文的介绍,我们可以了解到Oracle分析函数的强大之处,尤其是在处理复杂的分析需求时。这些函数不仅简化了SQL查询,而且提高了数据处理的效率。理解并熟练掌握这些函数对于Oracle开发者来说至关重要。在实际...
Oracle开发专题之分析函数11Oracle开发专题之分析函数6Oracle开发专题之分析函数210Oracle开发专题之分析函数314Oracle开发专题之窗口函数20Oracle开发专题之报表函
Oracle分析函数是Oracle数据库提供的一个高级SQL特性,它允许在查询结果集中进行复杂的数据分析。分析函数通过使用OVER子句,可以对数据进行分区、排序以及定义窗口大小等功能。它们在数据仓库、报告和在线事务处理...
### ORACLE报表分析利剑——分析函数:深度解析与应用 #### 一、理解分析函数:数据统计的新维度 分析函数作为Oracle数据库中一项高级功能,专为解决复杂报表统计需求设计,其核心优势在于能够对数据进行精细的...
Oracle 分析函数(用法+实例) Oracle 分析函数是 Oracle 8.1.6 版本中引入的高级应用,属于 Oracle 的一大亮点。分析函数可以分为四大类:排名函数、聚合函数、行比较函数和统计函数。下面将对分析函数的原理、...
主要包括分析函数(OVER);分析函数2(Rank, Dense_rank, row_number);分析函数3(Top/Bottom N、First/Last、NTile);窗口函数;报表函数;分析函数总结;26个分析函数;PLSQL开发笔记和小结;分析函数简述 ROW_NUMBER () ...
一、Oracle分析函数简介: 在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求;其次这些系统的业务逻辑...
### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且结果可以根据特定条件进行动态调整。这种灵活性使得Oracle分析函数在处理复杂的数据集时非常...
Oracle分析函数是数据库管理系统Oracle中的一个强大特性,它允许用户在SQL查询中执行复杂的分析操作。分析函数在处理报表和数据迁移任务时尤其有用,因为它们可以基于分组计算聚合值,并为每个分组返回多行,而不...
Oracle 9i 分析函数是数据库查询中一种强大的工具,它们允许在单个查询中对一组行进行聚合操作,同时保留原始行的细节。在Oracle数据库系统中,分析函数为数据分析师和数据库管理员提供了深入洞察数据的能力,尤其在...
### Oracle分析函数及开窗函数详解 #### 一、Oracle分析函数概述 Oracle自8.1.6版本开始引入了分析函数,这类函数主要用于计算基于组的聚合值,并且与传统的聚合函数不同的是,分析函数可以针对每个组返回多行结果...
Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...
ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧
总的来说,熟悉和掌握Oracle的分析函数对于开发人员来说非常重要,特别是在开发需要高效数据分析的报表系统时。虽然这种方法绑定到Oracle数据库,但如果项目确定使用Oracle,那么利用其特性可以显著提高开发效率和...