Скользящее среднее SSMS за день недели - PullRequest
1 голос
/ 08 апреля 2019

Руководство хочет знать, как товарищи по команде выступают по понедельникам и пятницам по сравнению с остальной частью рабочей недели. Ниже приведен пример временной базы данных Teammate X в течение двух месяцев. У каждого последующего товарища по команде есть отличная отправная точка, из которой они измеряются. Сначала я рассмотрел использование UNBOUNDED PRECEDING в сочетании с различными датами начала, но функции Windows не взаимодействуют. Помогите!

CREATE TABLE #RollingAverage
(
    [Date]     DATE PRIMARY KEY
    ,[Value]   INT
);

INSERT INTO #RollingAverage
SELECT '2019-01-02',626
UNION ALL SELECT '2019-01-03',231 UNION ALL SELECT '2019-01-04',572
UNION ALL SELECT '2019-01-07',775 UNION ALL SELECT '2019-01-09',660
UNION ALL SELECT '2019-01-10',662 UNION ALL SELECT '2019-01-11',541
UNION ALL SELECT '2019-01-14',849 UNION ALL SELECT '2019-01-15',632
UNION ALL SELECT '2019-01-16',906 UNION ALL SELECT '2019-01-18',961
UNION ALL SELECT '2019-01-21',501 UNION ALL SELECT '2019-01-24',311
UNION ALL SELECT '2019-01-25',614 UNION ALL SELECT '2019-01-28',296
UNION ALL SELECT '2019-01-29',390 UNION ALL SELECT '2019-01-31',804
UNION ALL SELECT '2019-02-01',928 UNION ALL SELECT '2019-02-05',855
UNION ALL SELECT '2019-02-06',605 UNION ALL SELECT '2019-02-08',283
UNION ALL SELECT '2019-02-12',144 UNION ALL SELECT '2019-02-14',382
UNION ALL SELECT '2019-02-15',862 UNION ALL SELECT '2019-02-18',549
UNION ALL SELECT '2019-02-19',401 UNION ALL SELECT '2019-02-20',515
UNION ALL SELECT '2019-02-21',590 UNION ALL SELECT '2019-02-22',625
UNION ALL SELECT '2019-02-25',304 UNION ALL SELECT '2019-02-26',402
UNION ALL SELECT '2019-02-27',326;

AVG(Value) over (ORDER BY [Date] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) не работает

1 Ответ

0 голосов
/ 08 апреля 2019

Первое, что вам нужно понять, это то, что ваша «ежедневная» работа не ежедневная.Простым решением было бы заполнить пробелы, чтобы иметь возможность эффективно подсчитывать дни.

Я заполнил пробелы, используя CTE, который на лету создает таблицу календаря, но вы можете использовать постоянную таблицу календаря, если она доступна.

WITH 
E(n) AS(
    SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
    SELECT a.n FROM E a, E b
),
cteCalendar(calDate) AS(
    SELECT TOP (61) 
        CAST( DATEADD( DD, 1-ROW_NUMBER() OVER(ORDER BY (SELECT NULL)), GETDATE()) AS date) AS calDate
    FROM E2
),
cteRollingAverages AS(        
    SELECT ra.[Date], 
        ra.value,
        AVG(Value) over (ORDER BY calDate ROWS BETWEEN 7 PRECEDING AND CURRENT ROW) RollingAverage
    FROM #RollingAverage AS ra
    RIGHT JOIN cteCalendar AS c ON ra.[Date] = c.calDate
)
SELECT *
FROM cteRollingAverages
WHERE [Date] IS NOT NULL
ORDER BY [Date];

Другой вариант - использовать APPLY.Это не ограничено определенной датой.

SELECT *
FROM #RollingAverage r
CROSS APPLY( SELECT AVG(i.[Value]) AS RollingAvg
            FROM #RollingAverage i
            WHERE i.[Date] BETWEEN DATEADD( DD, -7, r.[Date]) AND r.[Date]) av
ORDER BY [Date];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...