
到目前为止,我们学了解析函数在计算/统计数据一段时间是非常有用的,但是如果计算/统计需要去遍历记录集的每一个记录例如,例如:
列出每个月的订单总额和全年订单总额。
列出本月订单总额和订单总额。
列出上个月、下个月和下个月的订单总数和全年订单总数。
列出一周内的每日营业额和总营业额。
列出一周内的每日营业额和平均日营业额。
仔细回顾我们前面介绍的分析函数,我们会发现这些需要和前面一些不同的分析函数,我们引入前面是用来计算一个清楚的/阶段的记录集,而这部分的需求为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窗口函数的全部内容,希望能给大家一个参考,同时也希望大家多多支持。