`

oracle分析函数(1)

阅读更多
一.分析函数(OVER)

目录:
===============================================
1.Oracle分析函数简介
2. Oracle分析函数简单实例
3.分析函数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等。



一.分析函数2(rank\dense_rank\row_number)


目录
===============================================
1.使用rownum为记录排名
2.使用分析函数来为记录排名
3.使用分析函数为记录进行分组排名

一、使用rownum为记录排名:

在前面一篇《Oracle开发专题之:分析函数》,我们认识了分析函数的基本应用,现在我们再来考虑下面几个问题:

①对所有客户按订单总额进行排名
②按区域和客户订单总额进行排名
③找出订单总额排名前13位的客户
④找出订单总额最高、最低的客户
⑤找出订单总额排名前25%的客户

按照前面第一篇文章的思路,我们只能做到对各个分组的数据进行统计,如果需要排名的话那么只需要简单地加上rownum不就行了吗?事实情况是否如此想象般简单,我们来实践一下。

【1】测试环境:

SQL >   desc  user_order;
  Name                                       Null ?    Type
   -- --------------------------------------- -------- ----------------------------
  REGION_ID                                           NUMBER ( 2 )
  CUSTOMER_ID                                   NUMBER ( 2 )
  CUSTOMER_SALES                           NUMBER
【2】测试数据:
SQL >   select   *   from  user_order  order   by  customer_sales;

  REGION_ID CUSTOMER_ID CUSTOMER_SALES
-- -------- ----------- --------------
           5             1               151162
          10            29              903383
           6             7               971585
          10            28             986964
           9            21             1020541
           9            22            1036146
           8            16            1068467
           6             8             1141638
           5             3             1161286
           5             5             1169926
           8            19            1174421
           7            12            1182275
           7            11            1190421
           6            10            1196748
           6             9             1208959
          10            30            1216858
           5              2                 1224992
            9              24               1224992
            9              23               1224992
            8            18            1253840
           7            15            1255591
           7            13            1310434
          10            27           1322747
           8            20            1413722
           6             6             1788836
          10            26           1808949
           5             4             1878275
           7            14            1929774
           8            17            1944281
           9            25            2232703

30  rows selected.

分享到:
评论

相关推荐

    Oracle分析函数1

    Oracle分析函数是一种高级的SQL工具,主要用于处理复杂的数据分析任务,如报表统计和数据聚合。它们与传统的聚合函数(如SUM, AVG, COUNT等)不同,因为分析函数可以在数据集内进行分组计算,并且每组的每一行都可以...

    ORACLE分析函数1.ppt

    Oracle分析函数是数据库查询优化的重要工具,主要用于处理数据集中的聚合和排序操作,尤其是在处理大量数据时能够提高查询效率。在本案例中,我们将探讨如何使用分析函数优化SQL查询,并对比传统的子查询方法。 ...

    ORACLE分析函数教程

    ### Oracle分析函数详解 #### 一、Oracle分析函数概述 Oracle分析函数是在处理大量数据时极为有用的一套工具,主要用于在线分析处理(OLAP)场景。这类函数可以在多个级别上进行数据聚合,并支持复杂的排序、分组...

    oracle分析函数文档

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

    Oracle中的分析函数详解

    其中,Oracle的分析函数是其强大的特性之一,它允许用户在单个SQL查询中执行复杂的分析操作,而无需使用子查询或者自连接。这篇文档将深入探讨Oracle中的分析函数,帮助你更好地理解和利用这一功能。 一、什么是...

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

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

    ORACLE分析函数大全

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

    ORACLE 分析函数大全

    Oracle 分析函数是一种强大的SQL工具,它允许你在处理数据时执行复杂的分析操作,而不像聚合...参考书籍如Tom Kyte的《Expert One-on-One》和Oracle 9i SQL Reference等,都是深入学习和理解Oracle分析函数的宝贵资源。

    Oracle 分析函数

    Oracle分析函数是数据库查询中的一种高级特性,它允许在单个SQL语句中对一组行进行聚合操作,而不仅仅是整个结果集。分析函数通常用于计算累积、排名、分组等复杂计算,对于数据处理和报告生成非常有用。下面将详细...

    Oracle分析函数

    Oracle 分析函数详解 Oracle 分析函数是 Oracle 数据库中的一种强大功能,能够帮助用户快速进行数据分析和处理。在本文中,我们将对 Oracle 分析函数进行详细的介绍,并对其各个函数进行解释。 一、总体介绍 ...

    oracle 分析函数学习笔记

    Oracle 分析函数是一种高级SQL功能,它允许在单个查询中对数据集进行复杂的分析,无需额外的编程或多次数据库交互。分析函数处理的结果通常基于数据的分组、排序或特定窗口,为统计汇总和复杂的数据分析提供了便利。...

    oracle分析函数大全

    ### Oracle分析函数详解 #### 一、概述 Oracle分析函数是一种强大的工具,它自Oracle 8.1.6版本开始引入,并在后续版本中不断完善和发展。这类函数的主要用途在于能够针对一组数据执行复杂的聚合计算,并且不同于...

    oracle 分析函数

    oracle 分析函数 开发必备 数据库开发工程师

    Oracle分析函数.doc

    Oracle分析函数是数据库管理系统Oracle中的一种高级特性,用于处理和分析数据集,提供了一种高效的方式来执行聚合操作,而无需多次查询数据库。分析函数能够直接在单次查询中完成复杂的数据计算,包括排序、分组、...

    ORACLE分析函数.pdf

    Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它允许用户在单个查询中对一组行进行计算,而无需使用子查询或自连接。这些函数极大地增强了数据分析和报告的能力,提高了查询性能。以下是对Oracle分析...

    Oracle分析函数使用总结

    Oracle分析函数使用总结Oracle分析函数使用总结Oracle分析函数使用总结Oracle分析函数使用总结

    oracle分析函数.doc

    1. **Oracle分析函数简介** 分析函数的核心特性是`OVER`子句,它定义了一个"分析窗口",在这个窗口内执行计算。分析函数可以分为以下几类: - 排序函数:`RANK()`, `DENSE_RANK()`, `ROW_NUMBER()`,用于为数据...

    Oracle 分析函数.doc

    Oracle 分析函数是数据库查询中的强大工具,它们允许在单个SQL语句中对结果集进行复杂的计算和分组操作,极大地简化了数据分析的过程。在Oracle 8i版本之后引入,分析函数为处理大量数据提供了高效的方法,避免了...

    ORACLE_分析函数大全

    Oracle分析函数是数据库管理系统Oracle中的一种高级SQL特性,它们在数据处理和分析中扮演着重要角色。分析函数允许用户在结果集的每一行上执行计算,不仅考虑当前行,还考虑了同一组内的其他行。这与传统的聚合函数...

    Oracle分析函数教程

    Oracle分析函数是数据库管理系统Oracle中的一个重要特性,自8.1.6版本开始引入,它们用于执行基于组的聚合计算,并且为每个组返回多行结果,而不仅仅是单行。这使得分析函数在数据分析和报表生成方面非常有用,能够...

Global site tag (gtag.js) - Google Analytics