2016-07-28 4 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)で情報の実行されている最後の3日間の平均値を計算する必要があります。

私はさらに私の目標を説明する例を提供してみましょう:

ENTRY_DATE2012-02-01

この日付値を持っており、バック2日間が値を持っていないその後、2012年2月1日平均値が10であります2012-02-02日付は価値があり、2日後の日付は2012-02-01と2012-01-31を意味します2012-02-01日付価値がありますが、2012-01-31日付価値はありません2012-02-02の日付は10((10 + 20)/ 3 = 10)となります。2012-02-03は13.3((10 + 20 + 10)/ 3 = 13.3)

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 
関連する問題