Вот моя версия:
DECLARE @NumWeeks int
SET @NumWeeks = 26
SELECT s1.ProdID, s1.WeekEnd, COUNT(*) AS ZeroCount
FROM Sales s1
INNER JOIN Sales s2
ON s2.ProdID = s1.ProdID
AND s2.WeekEnd >= s1.WeekEnd
AND s2.WeekEnd <= DATEADD(WEEK, @NumWeeks + 1, s1.WeekEnd)
WHERE s1.Sales > 0
GROUP BY s1.ProdID, s1.WeekEnd
HAVING COUNT(*) >= @NumWeeks
Теперь, это делает критическое предположение, а именно, что нет повторяющихся записей (только 1 на продукт в неделю) и что новые данные фактически вводятся каждую неделю. С учетом этих предположений, если мы посмотрим на 27 недель после ненулевой недели продаж и обнаружим, что было 26 всего недель с нулевыми продажами, то мы можем логически вывести, что они должны были быть 26 подряд недель.
Обратите внимание, что при этом будут игнорироваться продукты с нулевыми продажами с самого начала; должна быть ненулевая неделя, чтобы закрепить ее. Если вы хотите включить продукты, у которых не было продаж с самого начала, добавьте следующую строку после `WHERE s1.Sales> 0 ':
OR s1.WeekEnd = (SELECT MIN(WeekEnd) FROM Sales WHERE ProdID = s1.ProdID)
Это значительно замедлит запрос, но гарантирует, что первая неделя «зарегистрированных» продаж всегда будет учитываться.