2013-02-16 6 views
-1

Как вы создаете метод Moving Average в SQL?Как вы создаете метод Moving Average в SQL?

заказ столика:

id_order id_staff date_order 
O0001 S0003 12/12/2555 
O0002 S0003 12/12/2555 
O0003 S0003 12/12/2555 
O0004 S0003 13/12/2555 
O0005 S0003 13/12/2555 
O0006 S0003 13/12/2555 
O0007 S0003 13/12/2555 
O0008 S0003 13/12/2555 

detail_order стол:

idde_order id_order id_material count 
M0004 O0003 S0002 3 
M0005 O0003 S0003 5 
M0009 O0003 S0002 3 
M0010 O0003 S0003 5 
M0011 O0003 S0001 3 

Желаемая соединения таблиц или выход:

Date   count 3 day Moving Average 
2012-05-01  2 
2012-05-02  3 
2012-05-03  5   4 
2012-05-04  1   3 
2012-05-05  2   3 
2012-05-06  3   3 
2012-05-07  2   3 

Теория

Month count 3-Month Moving Average  4-Month Moving Average 
January 10  
February12  
March 13  
April 16 (10+12+13)/3=11.67 
May  19 (12+13+16)/3=13.67 (10+12+13+16)/4=12.75 
June 23 (13+16+19)/3=16  (12+13+16+19)/4=15 
July 26 (16+19+23)/3=19.33 (13+16+19+23)/4=17.75 
August  (19+23+26)/3=22.67 (16+19+23+26)/4=21 

благодарит вас

+3

Пожалуйста, по крайней мере, сделайте некоторое исследование перед публикацией. Googling для «скользящей средней SQL» возвращает тысячи релевантных, полезных и углубленных статей. – Dai

+0

Если вы используете SQL Server 2012, вы можете сделать это с помощью функции окна. –

+0

В зависимости от того, как вы хотите учитывать отсутствующие дни/месяцы/независимо (если есть), вы можете использовать [этот подход] (http://stackoverflow.com/a/10706338/297408 «Как вычислить скользящую среднюю по последние n часов ") или [этот] (http://stackoverflow.com/a/911417/297408« Вывод SQL Select для вычисления скользящей средней колонки »). –

ответ

0
create table tmp (
    order_date datetime, 
    [count] int 
) 


insert into tmp 
    values ('2012-05-01', 2), 
     ('2012-05-02', 3), 
     ('2012-05-03', 5), 
     ('2012-05-04', 1), 
     ('2012-05-05', 2), 
     ('2012-05-06', 3), 
     ('2012-05-07', 2) 
GO 

select t.order_date, t.[count], ceiling((t.[count] + t2.[count] + t3.[count])/3.0) as moving_average_3day 
from (
    select order_date, dateadd(day, -1, order_date) as prev, dateadd(day, -2, order_date) as prev2, [count] 
    from tmp 
) t 
left outer join tmp t2 on t.prev = t2.order_date 
left outer join tmp t3 on t.prev2 = t3.order_date 
order by 1 
+0

Совокупные функции окна в SQL Server 2008 не поддерживают 'order by'. –

+0

Сделано до 2012 года, с данными, используемыми в вопросе. – muhmud