Как запросить среднее значение за последние n месяцев при группировании по другому полю - PullRequest
0 голосов
/ 24 мая 2019

У меня есть следующая таблица:

deviceid  year  month   value
432       2019  3       2571
432       2019  2       90
432       2019  1       314
432       2018  12      0
432       2018  11      100
437       2019  2       0
437       2019  1       1
437       2018  12      0
437       2018  11      3
437       2018  10      2
437       2018  9       0
437       2018  8       2

Мне нужен запрос, который для каждого ID устройства извлекает среднее значение за последние 3 месяца. Например:

deviceId  Average
432       991.7
437       0.3

Я совершенно уверен, что мне нужно использовать разделы или что-то подобное.

Я думаю, что это должно выглядеть примерно так, но я не могу понять, как получить среднее значение только за последние 3 месяца.

select deviceId, avg(value) from Table group by deviceid

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Другим вариантом будет вычисление даты из столбцов year и month, которые будут использоваться для сравнения.

DECLARE @ComparisonDate DATE = '20190301'; 
--Or, perhaps, EOMONTH(GETDATE(),-1) to get the last day of last month?

SELECT 
  deviceId,
  AVG(value) AS AvgValue
FROM
  @t as t
WHERE
  DATEFROMPARTS(year,month,1) >= DATEADD(MONTH,-3,@ComparisonDate)
GROUP BY
  deviceId;
1 голос
/ 24 мая 2019

Вы можете использовать ROW_NUMBER, чтобы выяснить, какие месяцы являются последними 3 для каждого идентификатора устройства.

Пример данных:

DECLARE @t TABLE (deviceid INT, year INT, month INT, value NUMERIC(12,2))
INSERT INTO @t VALUES 
(432, 2019 , 3 ,2571),
(432, 2019 , 2 ,90  ),
(432, 2019 , 1 ,314 ),
(432, 2018 , 12,0   ),
(432, 2018 , 11,100 ),
(437, 2019 , 2 ,0   ),
(437, 2019 , 1 ,1   ),
(437, 2018 , 12,0   ),
(437, 2018 , 11,3   ),
(437, 2018 , 10,2   ),
(437, 2018 , 9 ,0   ),
(437, 2018 , 8 ,2   )

Запрос:

;WITH cte AS (
    SELECT deviceid, value, 
        ROW_NUMBER() OVER (PARTITION BY deviceid ORDER BY year DESC, month DESC) rn
    FROM @t
)
SELECT deviceid, AVG(value) average
FROM cte
WHERE rn BETWEEN 1 AND 3
GROUP BY deviceid

Возвращает:

deviceid    average
432         991.666666
437         0.333333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...