Bem, o fato de você precisar calcular a média para cada hora, na verdade torna isso mais simples, pois você só precisa
SUM
a contagem do produto e divida-o por um número fixo (24). Então, acho que isso obterá os resultados desejados (embora, neste caso específico, um cursor seja realmente mais rápido):SELECT A.*, B.ProductCount/24 DailyMovingAverage
FROM ProductInventory A
OUTER APPLY ( SELECT SUM(ProductCount) ProductCount
FROM ProductInventory
WHERE ProductName = A.ProductName
AND [Date] BETWEEN DATEADD(HOUR,-23,A.[Date]) AND A.[Date]) B