Это то, что вы после.При этом используется условный агрегат, а предложение ROWS BETWEEN
для подсчета количества раз, когда Flag
имеет значение 1 в определенном «диапазоне».Это, однако, требует , чтобы строки были с 2-минутными интервалами.если нет, то не будет работать так, как вы ожидаете:
WITH VTE AS(
SELECT V.MONITORID,
CONVERT(smalldatetime,V.CREATEDATETIME,103) AS CREATEDATETIME,
Flag
FROM (VALUES (209263,'26/3/2019 16:56',1),
(209262,'26/3/2019 16:54',1),
(209261,'26/3/2019 16:52',1),
(209260,'26/3/2019 16:50',1),
(209259,'26/3/2019 16:48',1),
(209258,'26/3/2019 16:46',1),
(209257,'26/3/2019 16:44',1),
(209256,'26/3/2019 16:42',1),
(209255,'26/3/2019 16:40',1),
(209254,'26/3/2019 16:38',1),
(209253,'26/3/2019 16:36',1),
(209252,'26/3/2019 16:34',1),
(209251,'26/3/2019 16:32',1),
(209250,'26/3/2019 16:30',1),
(209249,'26/3/2019 16:28',1),
(209248,'26/3/2019 16:26',1),
(209247,'26/3/2019 16:24',1),
(209246,'26/3/2019 16:22',1),
(209245,'26/3/2019 16:20',1),
(209244,'26/3/2019 16:18',1)) V(MONITORID, CREATEDATETIME, Flag))
SELECT V.MONITORID,
V.CREATEDATETIME,
V.Flag,
COUNT(CASE V.Flag WHEN 1 THEN 1 END) OVER (ORDER BY V.CREATEDATETIME
ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS [Flag-4+4],
COUNT(CASE V.Flag WHEN 1 THEN 1 END) OVER (ORDER BY V.CREATEDATETIME
ROWS BETWEEN 4 PRECEDING AND CURRENT ROW) AS [Flag-8+0]
FROM VTE V
ORDER BY V.CREATEDATETIME DESC;