Мне нужно рассчитать недельные и месячные скользящие средние на датчик в день для большого набора данных выборки на основе некоторых критериев качества. У меня есть рабочее решение, основанное на коррелированных подзапросах (или сам присоединяется), но мне было интересно, возможно ли использование аналитических функций и приведет к лучшей производительности?Скользящие средние с использованием аналитических функций в T-SQL SQL Server 2014
Вот что я прямо сейчас (упрощенно):
CREATE TABLE Samples(
SensorId int,
SampleTime datetime,
Value float,
Quality float
)
WITH DailyAvg (SensorId, SampleDate, ValueSum, ValueCount)
AS
(
SELECT
SensorId,
CAST(SampleTime AS DATE) AS SampleDate,
SUM(Value) AS ValueSum,
COUNT_BIG(Value) AS ValueCount
FROM Samples
WHERE Quality > 0.95
GROUP BY SensorId, CAST(SampleTime AS DATE)
)
SELECT
SensorId,
SampleDate,
(SELECT SUM(d2.ValueSum)/SUM(d2.ValueCount) FROM DailyAvg AS d2 WHERE d2.SensorId = d1.SensorId AND d2.SampleDate BETWEEN DATEADD(DAY, -7, d1.SampleDate) AND d1.SampleDate) AS AverageLastWeek,
(SELECT SUM(d2.ValueSum)/SUM(d2.ValueCount) FROM DailyAvg AS d2 WHERE d2.SensorId = d1.SensorId AND d2.SampleDate BETWEEN DATEADD(DAY, -14, d1.SampleDate) AND d1.SampleDate) AS AverageLast2Weeks,
(SELECT SUM(d2.ValueSum)/SUM(d2.ValueCount) FROM DailyAvg AS d2 WHERE d2.SensorId = d1.SensorId AND d2.SampleDate BETWEEN DATEADD(MONTH, -1, d1.SampleDate) AND d1.SampleDate) AS AverageLastMonth
FROM DailyAvg d1
ORDER BY SensorId, SampleDate
Я попытался заменить суб-запроса для еженедельного среднего с ниже фрагмент кода, но это, очевидно, не может обрабатывать дней без каких-либо образцов правильно. Я думал об использовании выражений RANGE или PARTITION BY, но я не могу понять, как указать оконный кадр, чтобы выбрать образцы, например. "на прошлой неделе".
SUM(ValueSum) OVER(PARTITION BY SensorId ORDER BY SampleTime ROWS 7 PRECEDING)/SUM(ValueCount) OVER(PARTITION BY SensorId ORDER BY SampleTime ROWS 7 PRECEDING) AS AverageLastWeek
Я даже считал «Необычных Update», но помимо того, что грязно, я не думаю, что это имеет смысл с это много дней происходит усреднение.
Вам нужна информация последнего месяца или lastmonth per Id? Я думаю о фильтрации SampleTime до последнего месяца. – MelgoV
Если я правильно понимаю это, я считаю, что вы можете избежать использования функции PIVOT. Я не уверен, насколько быстрее это будет, но, безусловно, стоит того! – FutbolFan
Мне нужны скользящие средние для каждого идентификатора и для каждого дня. Например, на сегодняшний день каждый Идентификатор будет приводить к появлению ряда с недельным средним значением по образцам от 4/30 до 5/6 и среднемесячного значения по образцам с 4/7 по 5/6. Таким образом, оконные рамы больше шагов или разделов. – hjort