2013-02-16 78 views
-1

如何在SQL中創建移動平均法?如何在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

請至少做一些研究發佈之前。谷歌搜索「SQL移動平均數」返回數以千計的相關,有用和深入的文章。 – Dai 2013-02-16 10:31:31

+0

如果您使用的是SQL Server 2012,則可以使用窗口功能執行此操作。 – 2013-02-16 10:35:57

+0

根據你想如何考慮缺失的天/月/無論(如果有),你可以採取[這種方法](http://stackoverflow.com/a/10706338/297408「如何計算移動平均最後n小時「)或[this one](http://stackoverflow.com/a/911417/297408」用於計算運行平均列的SQL選擇語句「)。 – 2013-02-16 17:57:52

回答

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'。 – 2013-02-16 17:39:58

+0

在2012年之前製作了該問題中使用的數據。 – muhmud 2013-02-17 19:20:33