`
zhangdaiscott
  • 浏览: 406585 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8fb25857-16b4-3681-ab5e-e319f45c42a8
Jeecg快速开发平台
浏览量:0
文章分类
社区版块
存档分类

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

 
阅读更多

目录:
===============================================
1.Oracle分析函数简介
2. Oracle分析函数简单实例
3.分析函数OVER解析

一、Oracle分析函数简介:

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

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

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

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

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

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

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

【1】测试环境:

SQL>descorders_tmp;
Name
Null?Type
-----------------------------------------------
CUST_NBR NOTNULLNUMBER(5)
REGION_ID
NOTNULLNUMBER(5)
SALESPERSON_ID
NOTNULLNUMBER(5)
YEAR NOTNULLNUMBER(4)
MONTH NOTNULLNUMBER(2)
TOT_ORDERS
NOTNULLNUMBER(7)
TOT_SALES
NOTNULLNUMBER(11,2)

【2】测试数据:
SQL>select*fromorders_tmp;

CUST_NBRREGION_IDSALESPERSON_ID
YEARMONTHTOT_ORDERSTOT_SALES
--------------------------------------------------------------------------
11711 20017212204
454 200110237802
767 2001233750
106820011221691
106720012342624
1571220005624
1279 20006250658
152 20003244494
151 20009274864
25420003235060
254 2000446454
251 200010435580
454 200012239190

13rowsselected.

【3】测试语句:
SQL>selecto.cust_nbrcustomer,
2o.region_idregion,
3sum(o.tot_sales)cust_sales,
4sum(sum(o.tot_sales))over(partitionbyo.region_id)region_sales
5fromorders_tmpo
6whereo.year=2001
7groupbyo.region_id,o.cust_nbr;

CUSTOMERREGIONCUST_SALESREGION_SALES
------------------------------------------
4 53780237802
7 63750 68065
10 66431568065
11 71220412204

三、分析函数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*
2from(selecto.cust_nbrcustomer,
3o.region_idregion,
4sum(o.tot_sales)cust_sales,
5sum(sum(o.tot_sales))over(partitionbyo.region_id)region_sales
6fromorders_tmpo
7whereo.year=2001
8groupbyo.region_id,o.cust_nbr)all_sales
9whereall_sales.cust_sales>all_sales.region_sales*0.2;

CUSTOMERREGIONCUST_SALESREGION_SALES
------------------------------------------
453780237802
1066431568065
1171220412204

SQL
>

现在我们已经知道这些大客户是谁了!哦,不过这还不够,如果我们想要知道每个大客户所占的订单比例呢?看看下面的SQL语句,只需要一个简单的Round函数就搞定了。
SQL>selectall_sales.*,
2100*round(cust_sales/region_sales,2)||'%'Percent
3from(selecto.cust_nbrcustomer,
4o.region_idregion,
5sum(o.tot_sales)cust_sales,
6sum(sum(o.tot_sales))over(partitionbyo.region_id)region_sales
7fromorders_tmpo
8whereo.year=2001
9groupbyo.region_id,o.cust_nbr)all_sales
10whereall_sales.cust_sales>all_sales.region_sales*0.2;

CUSTOMERREGIONCUST_SALESREGION_SALES
PERCENT
----------------------------------------------------------------------------------
45 3780237802 100%
10 6 6431568065 94%
11 7 1220412204 100%

SQL
>

总结:

①Over函数指明在那些字段上做分析,其内跟Partition by表示对数据进行分组。注意Partition by可以有多个字段。

②Over函数可以和其它聚集函数、分析函数搭配,起到不同的作用。例如这里的SUM,还有诸如Rank,Dense_rank等。

参考资料:《Mastering Oracle SQL》(By AlanBeaulieu, SanjayMishraO'Reilly June 20040-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分析函数

    目录 Oracle开发专题之:分析函数(OVER) Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) Oracle开发专题之:分析函数3(Top/Bottom N、First/Last、NTile) Oracle开发专题之:窗口函数 ...

    Oracle开发专题之:分析函数

    在这些系统之外,还有一种称之为OLAP的系统(即Online Aanalyse Process),这些系统一般用于系统决策使用。通常和数据仓库、数据分析、数据挖掘等概念联系在一起。这些系统的特点是数据量大,对实时响应的要求不高...

    oracle分析函数

    Oracle开发专题之:分析函数Oracle开发专题之:分析函数

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

    oracle分析函数,oracle分析函数over_及开窗函数用法。

    Oracle开发的over函数

    Oracle开发的over函数

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

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

    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分析函数,主用于OLAP,以实例讲解分析函数. 如: 排序用Rank, Dense_rank, row_number 1.带空值的排列 2.Top/Bottom N查询 3.First/Last排名查询 4.按层次查询 1.窗口函数简介 2.窗口函数示例-全统计 3....

    ORACLE的OVER函数使用技巧

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

    Oracle自定义聚合函数-分析函数

    Oracle自定义聚合函数,分析函数.

    oracle数据仓库分析函数汇总

    oracle数据仓库分析函数汇总:over oracle 分析函数 数据仓库:带了测试数据,由浅到深圳分析数据仓库的分析函数,是BI入门的好帮手

    ORACLE分析函数教程

    关于ORACLE分析函数的教程,教程描述描述清晰

    oracle分析函数及开窗函数

    oracle分析函数及开窗函数的使用,包括over等分析函数

    oracle 分析函数

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

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

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

    ORACLE 分析函数大全

    ORACLE 分析函数大全,包含很多关于ORACLE的分析函数,内置函数

    ORACLE函数介绍 全系列中文

    oracle函数介绍 6 著名函数之分析函数 pdf oracle函数介绍 7 非著名函数之分析函数 pdf oracle函数介绍 8 综述 pdf">oracle函数介绍 1 著名函数之单值函数 pdf oracle函数介绍 2 非著名函数之单值函数 pdf ...

Global site tag (gtag.js) - Google Analytics