【问题标题】:Using Oracle analytics for average使用 Oracle 分析平均
【发布时间】:2016-11-22 15:44:54
【问题描述】:

我应该如何使用分析来获得样本量变化的滚动平均值?

create table MyVals  (Item_no char(10), epoch number, Yield number, Skip_Period char(1), Reset_Period char(1));

insert into MyVals values ('A00001',1705, 12, 'N','N');     /* 17.18181818  average of epochs 1705..1610 & 1607..1606 */    
insert into MyVals values ('A00001',1704, 13, 'N','N');     /* 19.45454545  average of epochs 1704..1610 & 1607..1605 */    
insert into MyVals values ('A00001',1703, 9,  'N','N');     /* 20.36363636  average of epochs 1703..1610 & 1607..1604 */    
insert into MyVals values ('A00001',1702, 11, 'N','N');     /* 21.5     average of epochs 1702..1610 & 1607..1604 */    
insert into MyVals values ('A00001',1701, 4,  'N','N');     /* 22.66666667  average of epochs 1701..1610 & 1607..1604 */    
insert into MyVals values ('A00001',1613, 16, 'N','N');     /* 25       average of epochs 1613..1610 & 1607..1604 */    
insert into MyVals values ('A00001',1612, 33, 'N','N');     /* 26.28571429  average of epochs 1612..1610 & 1607..1604 */    
insert into MyVals values ('A00001',1611, 2,  'N','N');     /* 25.16666667  average of epochs 1611..1610 & 1607..1604 */    
insert into MyVals values ('A00001',1610, 1,  'N','N');     /* 29.8     average of epochs 1610 & 1607..1604       */    
insert into MyVals values ('A00001',1609, 66, 'Y','N');     /* 37       average of epochs 1607..1604              */    
insert into MyVals values ('A00001',1608, 23, 'Y','N');     /* 37       average of epochs 1607..1604              */    
insert into MyVals values ('A00001',1607, 22, 'N','N');     /* 37       average of epochs 1607..1604              */    
insert into MyVals values ('A00001',1606, 66, 'N','N');     /* 42       average of epochs 1606..1604              */    
insert into MyVals values ('A00001',1605, 37, 'N','N');     /* 30       average of epochs 1605..1604              */    
insert into MyVals values ('A00001',1604, 23, 'N','Y');     /* 23       average of epochs 1604                    */    
insert into MyVals values ('A00001',1603, 77, 'N','N');     /* 44.83333333  average of epochs 1603..1511              */    
insert into MyVals values ('A00001',1602, 15, 'N','N');     /* 38.4     average of epochs 1602..1511              */    
insert into MyVals values ('A00001',1601, 82, 'N','N');     /* 44.25    average of epochs 1601..1511              */    
insert into MyVals values ('A00001',1513, 4,  'N','N');     /* 31.66666667  average of epochs 1513..1511              */    
insert into MyVals values ('A00001',1512, 7,  'N','N');     /* 45.5     average of epochs 1512..1511              */    
insert into MyVals values ('A00001',1511, 84, 'N','N');     /* 84       average of epochs 1511                    */    

如何获得前面最多 13 条记录的平均产量,其中 Skip_Period = 'N' 而 Reset_Period = 'N'

因此,平均值的窗口会根据 skip_Period 和 Reset_Period 的值根据这些规则而变化:

如果一行的 Reset_Period = 'Y',则不要返回该记录以外的任何位置。 如果一行有 Skip_period = 'Y',则从平均样本中排除该时段

我不知道如何在表达式之间创建一个范围,这将为我提供使用分析所需的滚动平均值。

欢迎任何建议:)

【问题讨论】:

  • 注释中的位是基于最大 13 行平均规则的该行的滚动平均值,不包括 skip_period='Y' 并且不超过 rest_period = 'Y ' 如果该行在 13 以内。

标签: oracle oracle-analytics


【解决方案1】:

我想这就是你所追求的:

WITH res AS (SELECT item_no,
                    epoch_number,
                    yield,
                    skip_period,
                    reset_period,
                    SUM(CASE WHEN reset_period = 'Y' THEN 1 ELSE 0 END) OVER (PARTITION BY item_no ORDER BY epoch_number) grp
             FROM   myvals)
SELECT item_no,
       epoch_number,
       yield,
       skip_period,
       reset_period,
       grp,
       AVG(CASE WHEN skip_period = 'N' THEN yield END) OVER (PARTITION BY item_no, grp
                                                             ORDER BY epoch_number
                                                             rows 12 preceding) rolling_avg_yield
FROM   res
ORDER BY epoch_number DESC;

ITEM_NO EPOCH_NUMBER      YIELD SKIP_PERIOD RESET_PERIOD        GRP ROLLING_AVG_YIELD
------- ------------ ---------- ----------- ------------ ---------- -----------------
A00001          1705         12 N           N                     1  17.1818181818182
A00001          1704         13 N           N                     1  19.4545454545455
A00001          1703          9 N           N                     1  20.3636363636364
A00001          1702         11 N           N                     1              21.5
A00001          1701          4 N           N                     1  22.6666666666667
A00001          1613         16 N           N                     1                25
A00001          1612         33 N           N                     1  26.2857142857143
A00001          1611          2 N           N                     1  25.1666666666667
A00001          1610          1 N           N                     1              29.8
A00001          1609         66 Y           N                     1                37
A00001          1608         23 Y           N                     1                37
A00001          1607         22 N           N                     1                37
A00001          1606         66 N           N                     1                42
A00001          1605         37 N           N                     1                30
A00001          1604         23 N           Y                     1                23
A00001          1603         77 N           N                     0  44.8333333333333
A00001          1602         15 N           N                     0              38.4
A00001          1601         82 N           N                     0             44.25
A00001          1513          4 N           N                     0  31.6666666666667
A00001          1512          7 N           N                     0              45.5
A00001          1511         84 N           N                     0                84

首先,您需要计算出要平均的组。为此,我们可以根据报告组是否发生变化生成 1 或 0 值,然后对这些值进行运行求和。

一旦我们有了它,只需将该列包含在分区中,然后如果跳过周期为 N,则在当前行和之前的 12 行上执行条件平均。

【讨论】:

  • 这几乎是正确的 - 关于跳过周期的规则很奇怪,这就是为什么我们不同意前 2 个值。当有一个跳过周期 = 'Y' 时,该值会从平均值中排除,但样本量也会减少。所以对于 1705 纪元,它是 1705..1610 和 1607..1606 的平均值。共 11 个样本。
  • 11?不是 13 - 1705..1610 和 1607..1604 吗?此外,只有前两个平均值不同。其他是一致的。我想你可能在某个地方犯了错误?
  • 不,这是正确的。这只是奇怪的业务规则:/skip period=Y 被排除在平均值之外,但从开始时期到结束时期的跨度不能超过 13。
  • 啊,对不起;我错过了那个特殊的要求。我认为 (item_no, epoch_number) 是唯一的?
  • 好的,我已经更新了我的答案;这次我觉得是对的!您可能需要对平均值进行四舍五入以获得您需要的答案的小数位数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2016-06-21
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多