Bene, il fatto che devi calcolare la media per ogni ora, in realtà lo rende più semplice, dal momento che devi solo SUM
contare il prodotto e dividerlo per un numero fisso (24). Quindi penso che questo otterrà i risultati desiderati (anche se in questo caso particolare, un cursore sarà effettivamente più veloce):
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