`
huibin
  • 浏览: 756807 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

ORACLE -- 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不就行了吗?事实情况是否如此想象般简单,我们来实践一下。
分享到:
评论

相关推荐

    oracle-sql(两本pdf)

    3. 查询数据:详述SELECT语句的使用,包括选择列、排序结果、分组数据、联接表和使用聚合函数。 4. 条件过滤:利用WHERE子句筛选数据,使用比较运算符、逻辑运算符和通配符。 5. 更新和删除数据:讲述UPDATE和DELETE...

    Oracle Press - Oracle Database 11g SQL

    《Oracle Press - Oracle Database 11g SQL》是专门针对Oracle数据库系统中SQL语言的一本详细教程,适合数据库管理员(DBA)、开发人员以及对Oracle SQL感兴趣的初学者学习。本书全面覆盖了Oracle 11g版本中的SQL...

    oracle函数

    分析函数在`oracle函数介绍(6) 著名函数之分析函数.doc`、`oracle函数介绍(7) 非著名函数之分析函数.doc`和`oracle函数介绍(5) 分析函数简述.doc`中详述,它们可以对整个结果集执行计算,而不仅仅是单行或分组。...

    Oracle11i中文帮助文档4

    这些文档主要以CHM(Compiled Help Manual)格式存在,这是一种Windows平台下常见的帮助文件格式,集成了索引、搜索和超链接功能,便于快速查找和学习Oracle的相关知识。 在Oracle11i中文帮助文档中,你可以找到...

    Oracle PL-SQL语言初级教程

    ### Oracle PL-SQL语言初级教程知识点详述 #### 一、PL/SQL语言基础 **概念解析:** PL/SQL(Procedural Language for SQL)是Oracle为增强其数据库功能而设计的一种强大的过程化编程语言。它融合了SQL的数据处理...

    oracle函数大全自己用

    本文将详述“Oracle函数大全”中涵盖的关键知识点,帮助读者深入理解和掌握Oracle数据库中的函数应用。 1. **字符串处理函数** - `SUBSTR()`:从字符串中提取子串。 - `LENGTH()`:返回字符串的长度。 - `UPPER...

    Oracle erp个人学习笔记

    #### 三、Oracle EBS模块详述:中文名称与英文缩写对照 Oracle E-Business Suite(EBS)提供了涵盖财务、分销、制造等多个领域的全面解决方案。以下是对主要模块的中文名称及其英文缩写的详细介绍: 1. **财务系统...

    Oracle(CHM).zip

    2. **安装与配置**:详述如何在不同的操作系统上安装Oracle数据库,包括服务器配置、网络设置、实例创建等步骤。 3. **SQL语言**:深入讲解Oracle SQL语法,包括数据查询、插入、更新、删除操作,以及更复杂的联接...

    最完整的Toad For Oracle使用手册

    - **Toad for Oracle**:是一款强大的数据库开发与管理工具,适用于Oracle数据库环境。 - **新版本特性**:概述了Toad for Oracle最新版本的主要更新与改进之处。 #### 二、Toad与Oracle集成 - **DB Admin Module*...

    oracle9i中文教程7-13章

    第九章:“编程进阶---PLSQL”详述了Oracle的Procedural Language/Structured Query Language (PL/SQL)编程。PL/SQL是Oracle特有的编程语言,用于处理数据库事务、编写存储过程和函数,以及进行复杂的逻辑控制。本章...

    13.Oracle常用函数1

    分析函数在Oracle中用于基于分组计算聚合值,每个组可能返回多行,但此处不再详述。 在实际开发中,理解和熟练掌握这些函数对于处理和分析数据至关重要。例如,字符串函数在处理文本数据时非常有用,而数字函数在...

    oracle高效设计中英文版一套

    书中详述了B树索引、位图索引、函数索引等多种类型的优缺点,并指导读者在何时何地使用何种索引,以及如何维护和调整索引来适应数据的变化。 四、物化视图与缓存 物化视图可以帮助快速获取预计算的结果,对于报表...

    精通OracleSQL第2版.zip

    《精通Oracle SQL(第2版)》是一本深入解析Oracle数据库查询语言的专业书籍,由Oracle ACE和OakTable团队的专家共同撰写,集成了他们的丰富经验和专业知识。这本书旨在帮助读者掌握Oracle SQL的高级技巧,提升在...

    Oracle 11g 从入门到精通

    Oracle 11g是Oracle公司推出的数据库管理系统,它在企业级数据存储、管理和分析方面具有广泛的应用。本教程“Oracle 11g 从入门到精通”旨在帮助初学者掌握Oracle 11g的核心概念和技术,逐步提升为熟练的数据库管理...

    Effective_Oracle_by_Design(oracle高效设计)

    《Effective Oracle by Design》是Oracle数据库领域的一本经典著作,深入探讨了如何高效地设计和优化Oracle数据库系统。这本书由专家撰写,旨在帮助读者理解Oracle数据库的工作原理,并提供实用的策略来提高性能、...

    Oracle11g官方文档中英对照版

    Oracle 11g是甲骨文公司发布的一款重要的数据库管理系统,广泛应用于企业级数据存储、管理和分析。这个“Oracle11g官方文档中英对照版”提供了全面且权威的参考资料,帮助用户深入理解和掌握Oracle 11g的各项功能。...

    Oracle九阴真经

    《Oracle九阴真经》是Oracle数据库学习领域中的一份重要参考资料,其以CHM(Compiled Help Manual)格式封装,通常包含了大量的技术文档、教程和问题解决方案。CHM是一种微软开发的帮助文件格式,用于集合大量文本、...

    Oracle工程师培训教程4

    Oracle工程师培训教程4是专为Oracle数据库管理员设计的一份详细指南,涵盖了Oracle系统的全面操作。这份PPT教程可能包括以下几个核心知识点: 1. **Oracle数据库基础**:介绍Oracle数据库的基本概念,如数据库架构...

    oracle函数大全

    本文将详述Oracle函数大全中的关键知识点,帮助用户更好地理解和使用这些函数。 1. **数学函数** - `ABS(x)`: 返回数字x的绝对值。 - `MOD(n, m)`: 返回n除以m的余数。 - `ROUND(x[, d])`: 对数字x进行四舍五入...

Global site tag (gtag.js) - Google Analytics