2016-07-28 285 views
1

我在SQL Server中遇到任務問題。我打算創建的表的名稱稱爲「目標」。如何在SQL Server中實現3天移動平均值

CREATE TABLE target 
(
    [entry_date] [date] NOT NULL, 
    [value] [int] NOT NULL, 
    [id] [int] NULL, 
) 

INSERT target VALUES ('2012-02-01', 10, 1); 
INSERT target VALUES ('2012-02-02', 20, 2); 
INSERT target VALUES ('2012-02-03', 10, 3); 
INSERT target VALUES ('2012-02-04', 30, 4); 
INSERT target VALUES ('2012-02-05', 10, 3); 
INSERT target VALUES ('2012-02-06', 11, 3); 
INSERT target VALUES ('2012-02-06', 40, 6); 
INSERT target VALUES ('2012-02-07', 10, 2); 
INSERT target VALUES ('2012-02-08', 50, 5); 
INSERT target VALUES ('2012-02-09', 10, 8); 
INSERT target VALUES ('2012-02-10', 60, 9); 
INSERT target VALUES ('2012-02-10', 50, 9); 

基於以上數據,我希望得到的輸出象下面這樣:

entry_date |value|id |averagevaluesof_3days 
-----------+-----+----+---------------------- 
2012-02-01 |10 |1 | 10 
2012-02-02 |20 |2 | 10 
2012-02-03 |10 |3 | 13.3 
2012-02-04 |30 |4 | 20 
2012-02-05 |10 |3 | 16.6 
2012-02-06 |40 |6 | 30.3 
2012-02-06 |11 |3 | 30.3 
2012-02-07 |10 |2 | 23.6 
2012-02-08 |50 |5 | 37 
2012-02-09 |10 |8 | 23.3 
2012-02-10 |60 |9 | 56.6 
2012-02-10 |50 |9 | 56.6 

我需要在日期(entry_date)來計算的信息運行的最後三天的平均值。

讓我提供進一步的解釋我的目標的例子:

ENTRY_DATE2012-02-01

此日期有值,後面2個幾天不具有價值則2012-02-01平均值爲10如果我們採取2012-02-02日期有價值和返回2天意味着2012-02-01和2012-01-31這裏我們有2012-02-01日期值,但我們沒有2012-01-31日期值如果採取2012-02-03爲13.3((10 + 20 + 10)/ 3 = 13.3),則2012-02-02日期的平均值爲3日(10 + 20)/ 3 = 10)

請告訴我如何編寫查詢以實現SQL Server的此任務。

回答

0

試試這個:

SELECT 
    [entry_date], [value], [id], Totol_3daysValue/DaysCount AS Avg_3days 
FROM 
    target t 
OUTER APPLY 
    (SELECT 
     SUM(tt.Value) Totol_3daysValue, 
     CASE 
      WHEN COUNT(tt.value) > 1 
       THEN 3.0 
      ELSE 1.0 
     END AS DaysCount 
    FROM 
     target tt 
    WHERE 
     tt.entry_date BETWEEN DATEADD(dd, -2, t.entry_date) AND t.entry_date) av