Вы можете использовать функцию LAG, чтобы найти уровень запаса для каждого периода:
SELECT ItemID, StockLevel, EventTimeStamp AS lo,
LEAD(EventTimeStamp,1) OVER (PARTITION BY itemId ORDER BY EventTimeStamp) AS hi
Это должно дать вам:
ItemID StockLevel lo hi
536 205 2019-11-05 10:01 null
536 206 2019-11-05 09:37 2019-11-05 10:01
Затем вы можете использовать этот выход, чтобы найтиотрицательные уровни запасов и количество времени
SELECT ItemId, DATEDIFF(HOUR,hi,lo) AS p
FROM (
SELECT ItemID, StockLevel, EventTimeStamp AS lo,
LEAD(EventTimeStamp,1) OVER (PARTITION BY itemId ORDER BY EventTimeStamp) AS hi
)
WHERE StockLevel < 0
Вы должны быть в состоянии СУММАТЬ часы по месяцам по ItemID