oracle开发的窗口功能

oracle开发的窗口功能
一、窗口功能简介:

到目前为止,我们学了解析函数在计算/统计数据一段时间是非常有用的,但是如果计算/统计需要去遍历记录集的每一个记录例如,例如:

列出每个月的订单总额和全年订单总额。

列出本月订单总额和订单总额。

列出上个月、下个月和下个月的订单总数和全年订单总数。

列出一周内的每日营业额和总营业额。

列出一周内的每日营业额和平均日营业额。

仔细回顾我们前面介绍的分析函数,我们会发现这些需要和前面一些不同的分析函数,我们引入前面是用来计算一个清楚的/阶段的记录集,而这部分的需求为2,用遍历记录同时设置一个记录。

也就是说,统计数据不仅发生一次,而是很多次。统计数据没有形成后的记录发生,但发生在一个记录集的形成过程。

这是我们这次要介绍的窗口函数的应用,适用于下列场合:

(1)通过指定一批记录,例如从当前记录到某一部分的最后一条记录的结束。

通过指定一个时间间隔,例如,在交易日前30天。

(3)通过指定一系列值:例如,占当前交易量的5%的所有记录。

两。窗口函数示例-所有统计:

这里是我们的需求:一个月订单总额和全年订单总量,看看窗口函数的应用。

(1)测试环境:

复制代码代码如下:SQL >查询订单;

名称是否为空类型

-----------------------------------------------

月号(2)

tot_sales数

SQL >

(2)测试数据:

复制代码代码如下:从订单中选择;

月tot_sales

雇佣

一百六十一万零六百九十七

二百四十二万八千六百七十六

三百六十三万七千零三十一

四百五十四万一千一百四十六

五百五十九万二千九百三十五

六百五十万一千四百八十五

七百六十万六千九百一十四

八百四十六万零五百二十

九百三十九万二千八百九十八

一千零五十一万零一百一十七

一千一百五十三万二千八百八十九

一千二百四十九万二千四百五十八

已经选了12行。

(3)测试语句:

回顾Oracle以前的开发:分析功能(过)。我们使用金额(金额(tot_sales))在(分区region_id)在每个分区订单总金额数。现在我们要数不仅每个分区,但所有的分区,并在分区region_id不工作。

Oracle为这个案例提供了一个子句…之前和…下面,随便猜猜它是什么意思:XXX和XXX前后的所有记录,实际情况如何让我们通过实例来验证:

复制代码代码如下:sql选择月份,

和(tot_sales)month_sales,

金额(金额(tot_sales))在(以月)

无界之前和无界以下行之间)total_sales

从订单

按月分组;

月month_sales total_sales

--------------------------------

十六兆一千零六十九亿七千六百三十万七千七百六十六

二十四兆二千八百六十七亿六千六百三十万七千七百六十六

三十六兆三千七百零三亿一千六百三十万七千七百六十六

四十五兆四千一百一十四亿六千六百三十万七千七百六十六

五十五兆九千二百九十三亿五千六百三十万七千七百六十六

六十五兆零一百四十八亿五千六百三十万七千七百六十六

七十六兆零六百九十一亿四千六百三十万七千七百六十六

八十四兆六千零五十二亿零六百三十万七千七百六十六

九十三兆九千二百八十九亿八千六百三十万七千七百六十六

一百零五兆一千零一十一亿七千六百三十万七千七百六十六

一百一十五兆三千二百八十八亿九千六百三十万七千七百六十六

一百二十四兆九千二百四十五亿八千六百三十万七千七百六十六

已经选了12行。

绿色高亮的代码在这里起着关键的作用,它告诉Oracle数月销售从第一次记录到最后一条记录,统计进行12次在一个记录集的形成过程,并很time-consuming.but至少我们已经解决了这个问题。

前和后的无界无界意味着目前所有的记录,这是第一个和后来的记录,表中的所有记录。如果我们直接指定从第一次记录到最后吗看看下面的结果:

复制代码代码如下:sql选择月份,

和(tot_sales)month_sales,

金额(金额(tot_sales))在(以月)

1前和无界以下行之间)all_sales

从订单

按月分组;

月month_sales all_sales



十六兆一千零六十九亿七千六百三十万七千七百六十六

二十四兆二千八百六十七亿六千六百三十万七千七百六十六

三十六兆三千七百零三亿一千五百六十九万七千零六十九

四十五兆四千一百一十四亿六千五百二十六万八千三百九十三

五十五兆九千二百九十三亿五千四百六十三万一千三百六十二

六十五兆零一百四十八亿五千四百零九万零二百一十六

七十六兆零六百九十一亿四千三百四十九万七千二百八十一

八十四兆六千零五十二亿零二百九十九万五千七百九十六

九十三兆九千二百八十九亿八千二百三十八万八千八百八十二

一百零五兆一千零一十一亿七千一百九十二万八千三百六十二

一百一十五兆三千二百八十八亿九千一百五十三万五千四百六十四

一百二十四兆九千二百四十五亿八千一百零二万五千三百四十七

已经选了12行。

很显然,这种说法是错误的。真正的1不是第一个记录的开始的意思,但以往记录当前记录。在前面的前面的限定词是记录数的引用时,窗口函数被执行,就像无界是告诉Oracle是否目前的记录是第一,只要前面有很多记录,它包括在统计范围。

三。窗口函数步进滚动统计(累积平均值):

考虑到上面提到的第二个要求:列出每月的订单量和订单总金额为当月。也就是说,二月的记录将显示该月的订单和1 2.the笔本月订单占总订单和月对1,2,3个月订单总额的金额将显示在三月,等等。

显然,这种需求需要数n个月的总订单数,当订单总数为n个月时,请考虑上面的陈述,如果我们能改变和无限地跟随到代表当前月份的逻辑中!幸运的是,Oracle已经考虑到我们的需要,所以我们必须声明一点:改变发展排好。

复制代码代码如下:sql选择月份,

和(tot_sales)month_sales,

金额(金额(tot_sales))在(以月)

无界之前和当前行的行之间)current_total_sales

从订单

按月分组;

月month_sales current_total_sales

----------------------------------------

一兆六千一百零六亿九千七百六十一万零六百九十七

二十四兆二千八百六十七亿六千一百零三万九千三百七十三

三十六兆三千七百零三亿一千一百六十七万六千四百零四

四十五兆四千一百一十四亿六千二百二十一万七千五百五十

五十五兆九千二百九十三亿五千二百八十一万零四百八十五

六十五兆零一百四十八亿五千三百三十一万一千九百七十

七十六兆零六百九十一亿四千三百九十一万八千八百八十四

八十四兆六千零五十二亿零四百三十七万九千四百零四

九十三兆九千二百八十九亿八千四百七十七万二千三百零二

一百零五兆一千零一十一亿七千五百二十八万二千四百一十九

一百一十五兆三千二百八十八亿九千五百八十一万五千三百零八

一百二十四兆九千二百四十五亿八千六百三十万七千七百六十六

已经选了12行。

现在我们可以得到滚动的总销售额!下面的统计数据看起来更完美,它显示了我们需要的所有数据。

复制代码代码如下:sql选择月份,

和(tot_sales)month_sales,

金额(金额(tot_sales))在(以月)

无界之前和当前行的行之间)current_total_sales,

金额(金额(tot_sales))在(以月)

无界之前和无界以下行之间)total_sales

从订单

按月分组;

月month_sales current_total_sales total_sales

离开

1610697610697 6307766

24286761039373 6307766

36370311676404 6307766

45411462217550 6307766

55929352810485 6307766

65014853311970 6307766

76069143918884 6307766

84605204379404 6307766

93928984772302 6307766

105101175282419 6307766

115328895815308 6307766

124924586307766 6307766

已经选了12行。

在一些销售报告中,我们经常看到平均价值的需求。有时可能是全年数据的平均值,有时是所有数据的平均值,这很简单,只需要:

金额(金额(tot_sales))是由AVG(和(tot_sales))。

四,窗口功能步-根据时间范围统计:

正如我们前面提到的,窗函数不仅适用于指定的记录统计,也适用于在一定范围内统计。例如,下面的SQL语句在五天内计算销售额和销售额。
复制代码如下:选择trunc(order_dt)天,

和(sale_price)daily_sales,

AVG(sum(sale_price))在(以TRUNC(order_dt))

区间'2'day前之间的范围

区间'2'day以下)five_day_avg

从cust_order

在sale_price不空

和order_dt之间to_date('01-jul-2001 ','dd-mon-yyyy)

和to_date('31-jul-2001 ','dd-mon-yyyy)

为了计算指定的范围,Oracle使用关键字范围和间隔来指定一个范围。上面的示例告诉Oracle在当前的日期的前2天内查找记录,在接下来的2天内,并计算平均销售值。

五、先进的first_value / last_value窗函数:

Oracle提供了2个额外的功能:first_value和last_value,这是用来找到窗口中的记录集的第一个和最后一个记录。假设我们的报告需要显示当前月的销售情况,上个月和下个月的销售,平均每3个月,可以利用这两个函数。

复制代码代码如下:选择月份,

first_value(sum(tot_sales))在(以月)

1前和1后prev_month行间),

和(tot_sales)monthly_sales,

last_value(sum(tot_sales))在(以月)

1前和1后next_month行间),

AVG(sum(tot_sales))在(以月)

1前和1后rolling_avg行间)

从订单

凡年= 2001

和region_id = 6

集团的月

按月订货;

首先我们来看看:1前和1后之间行告诉Oracle在当前记录之前和一系列的搜索和统计后,与first_value和last_value在3记录找出分别第一和第三的记录,所以我们可以很容易地得到销售记录的平均值接近三个月!

六、窗口函数步比较相邻记录:

通过第五部分的学习,我们知道如何使用窗口函数来显示相邻的记录。现在,如果我们想展示当月的销售量和上个月的销售量,我们该怎么办

从本文的第五部分,我们可以知道,first_value使用(和(tot_sales)(以月排在前1和0之间))可以做,事实上,Oracle有一个更简单的方法让我们来比较2个记录,它是滞后的功能。

腿的功能类似于前面和后面的从句。它可以通过与当前记录的相对位置来应用。在比较同一相邻记录集中的两个相邻记录时尤其有用。

复制代码代码如下:选择月份,

和(tot_sales)monthly_sales,

滞后(sum(tot_sales),1)在(以月)prev_month_sales

从订单

凡年= 2001

和region_id = 6

集团的月

按月订货;

在滞后1(sum(tot_sales),1)是根据一月。

以上是oracle窗口函数的全部内容,希望能给大家一个参考,同时也希望大家多多支持。

tag:窗口功能电脑软件Oracle

相关内容