2010-11-04 88 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