2010-11-04 107 views
2

你好,我有一个问题。我知道如何使用oracle分析函数计算最近3个月的移动平均数......但我的情况有点不同移动平均值2列

Month ----- ProductType ----- Sales --------- - 平均(必须找到THIS)

1 ---------甲--------------- 10

1 ------ --- B --------------- 12

1 --------- C --------------- 17

2 --------- A --------------- 21

3 --------- C --------------- 2

3 --------- B -------- --------- 21

4 ---------乙--------------- 23

因此,我们有每个月和每种产品类型的销售额......我需要计算过去3个月和特定产品的移动平均值。

例如:

月分4和货号乙这将是(21 + 0 + 12)/ 3

任何想法?

回答

3
SELECT month, 
     productType, 
     sales, 
     (lag(sales, 3) over (partition by produtType order by month) + 
     lag(sales, 2) over (partition by productType order by month) + 
     lag(sales, 1) over (partition by productType order by month)/3 moving_avg 
    FROM your_table_name 
+0

作品很好的窗口子句。但是有没有办法可以将零值看作零点?例如...当我没有这些3行中的一个值时,我可以认为是零并计算出平均值? – mahen 2010-11-04 14:05:20

+0

@mahen:只需在延迟短语中添加一个NVL即可。 (NVL(销售,0),x)或NVL(滞后(销售,x),0) – Bill 2010-11-04 14:13:39

3

另一种选择是使用的解析函数

with my_data as (
    select 1 as month, 'A' as product, 10 as sales from dual union all 
    select 1 as month, 'B' as product, 12 as sales from dual union all 
    select 1 as month, 'C' as product, 17 as sales from dual union all 
    select 2 as month, 'A' as product, 21 as sales from dual union all 
    select 3 as month, 'C' as product, 2 as sales from dual union all 
    select 3 as month, 'B' as product, 21 as sales from dual union all 
    select 4 as month, 'B' as product, 23 as sales from dual 
) 
select 
    month, 
    product, 
    sales, 
    nvl(sum(sales) 
    over (partition by product order by month 
      range between 3 preceding and 1 preceding),0)/3 as average_sales 
from my_data 
order by month, product