2010-11-04 2 views
2

Здравствуйте, у меня есть проблема. Я знаю, как вычислять скользящее среднее за последние 3 месяца с использованием аналитических функций оракула ... но моя ситуация немного отличаетсяСкользящее среднее из 2 столбцов

месяц ----- ProductType ----- Sales --------- -Средняя (должны найти ЭТО)

1 --------- A --------------- 10

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

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

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

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

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

4 --------- Б --------------- 23

Итак, у нас есть продажи за каждый месяц и каждый тип продукта ... Мне нужно рассчитать скользящую среднюю за последние 3 месяца и конкретный продукт.

пример:

В месяц 4 и Produt B это будет (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

хорошо работает. Но есть ли способ считать нули равными нулю? например ... когда у меня нет значения в одной из этих трех строк, я могу считать это нулевым и вычислить среднее значение? – mahen

+0

@mahen: просто добавьте NVL к фразе задержки. либо отставание (NVL (продажи, 0), x) или NVL (отставание (продажи, x), 0) – Bill

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 
Смежные вопросы