Вы можете использовать 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