Как получить 3-дневную скользящую среднюю в SQL Server

У меня проблемы с задачей в 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).

Позвольте мне привести пример, объясняющий мою цель:

Дата_входа: 2012-02-01

Эта дата имеет значение, а 2 дня назад не имеют значения, тогда среднее значение 2012-02-01 равно 10, если мы возьмем дату 2012-02-02, имеющую значение, а 2 дня назад означает 2012-02-01 и 2012-01-31. здесь у нас есть значение даты 2012-02-01, но у нас нет значения даты 2012-01-31, тогда возьмите среднее значение за 3 дня для 2012-02-02, дата равна 10 ((10 + 20)/3 = 10), если мы возьмите 2012-02-03 13,3 ((10+20+10)/3 = 13,3)

Подскажите, пожалуйста, как написать запрос для выполнения этой задачи для SQL Server.


person vasusiva    schedule 28.07.2016    source источник


Ответы (1)


Попробуй это:

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
person Jatin Patel    schedule 28.07.2016