`
nesta2001zhang
  • 浏览: 70209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle开发专题之:分析函数(OVER)

 
阅读更多

一、Oracle分析函数简介:

在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求;其次这些系统的业务逻辑一般比较复杂,可能需要经过多次的运 算。比如我们经常接触到的电子商城。

在这些系统之外,还有一种称之为OLAP的系统(即Online Aanalyse Process),这些系统一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系在一起。这些系统的特点是数据量大,对实时响应的要求不 高或者根本不关注这方面的要求,以查询、统计操作为主。

我们来看看下面的几个典型例子:
①查找上一年度各个销售区域排名前10的员工
②按区域查找上一年度订单总额占区域订单总额20%以上的客户
③查找上一年度销售最差的部门所在的区域
④查找上一年度销售最好和最差的产品

我们看看上面的几个例子就可以感觉到这几个查询和我们日常遇到的查询有些不同,具体有:

①需要对同样的数据进行不同级别的聚合操作
②需要在表内将多条数据和同一条数据进行多次的比较
③需要在排序完的结果集上进行额外的过滤操作

二、Oracle分析函数简单实例:

下面我们通过一个实际的例子:按区域查找上一年度订单总额占区域订单总额20%以上的客户,来看看分析函数的应用。

【1】测试环境:

SQL >   desc  orders_tmp;
 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】测试数据:

SQL >   select   *   from  orders_tmp;

  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】测试语句:
SQL >   select  o.cust_nbr customer,
  
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%以上的大客户了
SQL >   select   *
  
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函数就搞定了。
SQL >   select  all_sales. * ,
  
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)

分享到:
评论

相关推荐

    oracle 分析函数详解(有例子)

    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开发中的OVER函数详解 #### 一、Oracle分析函数简介 在Oracle数据库开发中,分析函数是一类非常强大的工具,主要用于实现复杂的查询需求,尤其是在处理大量数据时,能够提供高级的数据汇总、排序和筛选...

    Oracle中的分析函数详解

    Oracle数据库系统是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。其中,Oracle的分析函数是其强大的特性之一...因此,对分析函数的深入理解是成为高级Oracle数据库开发人员的关键技能之一。

    oracle分析函数over_及开窗函数.txt

    ### Oracle分析函数OVER及开窗函数详解 #### 一、概述 在Oracle数据库中,分析函数(Analytic Functions)是一种非常强大的工具,用于处理复杂的查询需求。这些函数可以在一组相关的行上执行计算,并且每行返回一个...

    oracle分析函数

    Oracle开发专题之分析函数11Oracle开发专题之分析函数6Oracle开发专题之分析函数210Oracle开发专题之分析函数314Oracle开发专题之窗口函数20Oracle开发专题之报表函

    Oracle_分析函数

    Oracle分析函数是Oracle数据库提供的一个高级SQL特性,它允许在查询结果集中进行复杂的数据分析。分析函数通过使用OVER子句,可以对数据进行分区、排序以及定义窗口大小等功能。它们在数据仓库、报告和在线事务处理...

    ORACLE报表分析利剑——分析函数

    ### ORACLE报表分析利剑——分析函数:深度解析与应用 #### 一、理解分析函数:数据统计的新维度 分析函数作为Oracle数据库中一项高级功能,专为解决复杂报表统计需求设计,其核心优势在于能够对数据进行精细的...

    oracle的分析函数over 及开窗函数

    ### Oracle的分析函数OVER及开窗函数 #### 一、分析函数OVER ##### 1. 概念介绍 从Oracle 8.1.6版本开始,Oracle引入了分析函数,这些函数可以对分组的数据执行复杂的操作,如计算累积总和、排名等。与聚合函数...

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

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

    ORACLE 常用分析函数

    主要包括分析函数(OVER);分析函数2(Rank, Dense_rank, row_number);分析函数3(Top/Bottom N、First/Last、NTile);窗口函数;报表函数;分析函数总结;26个分析函数;PLSQL开发笔记和小结;分析函数简述  ROW_NUMBER () ...

    Oracle开发之分析函数简介Over用法

    一、Oracle分析函数简介: 在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求;其次这些系统的业务逻辑...

    oracle分析函数文档

    ### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它允许用户对分组数据执行复杂的计算,并且结果可以根据特定条件进行动态调整。这种灵活性使得Oracle分析函数在处理复杂的数据集时非常...

    ORACLE分析函数大全

    Oracle分析函数是数据库管理系统Oracle中的一个强大特性,它允许用户在SQL查询中执行复杂的分析操作。分析函数在处理报表和数据迁移任务时尤其有用,因为它们可以基于分组计算聚合值,并为每个分组返回多行,而不...

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

    Oracle 9i 分析函数是数据库查询中一种强大的工具,它们允许在单个查询中对一组行进行聚合操作,同时保留原始行的细节。在Oracle数据库系统中,分析函数为数据分析师和数据库管理员提供了深入洞察数据的能力,尤其在...

    oracle分析函数及开窗函数

    ### Oracle分析函数及开窗函数详解 #### 一、Oracle分析函数概述 Oracle自8.1.6版本开始引入了分析函数,这类函数主要用于计算基于组的聚合值,并且与传统的聚合函数不同的是,分析函数可以针对每个组返回多行结果...

    ORACLE的OVER函数使用技巧

    ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧ORACLE的OVER函数使用技巧

Global site tag (gtag.js) - Google Analytics