如何在SQL Server中实现3天移动平均值

时间:2016-07-28 07:16:41

标签: sql-server sql-server-2012

我在SQL Server中遇到任务有问题。我打算创建的表的名称称为“目标”。

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_date 2012-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 - 02日期平均需要3天10((10 + 20)/ 3 = 10 )如果我们采取2012-02-03是13.3((10 + 20 + 10)/ 3 = 13.3)

请告诉我如何编写查询以实现SQL Server的此任务。

1 个答案:

答案 0 :(得分: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