我在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的此任务。
答案 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