Альтернативное решение.
Суть в том, чтобы в Ranked посчитать количество предшествующих нулей. Это число и образует группы. Следующим шагом (D_Rank) присваиваем ранг каждой группе.
Должно работать независимо от наличия или отсутствия лидирующих строк с нулями:
WITH Ranked AS (
-- Создание ранжированной таблицы с группами
SELECT
id,
num,
CASE
WHEN num = 0 THEN 0
ELSE SUM(CASE WHEN num = 0 THEN 1 ELSE 0 END) OVER (ORDER BY id) + 1 --добавляем + 1, чтобы в случаях если нет первой строки с нулевым значением скрипт корректно работал. Иначе присваивается группа 0 и некорректно обрабатывается следующим блоком.
END as grp
FROM
t -- имя вашей таблицы
)
, D_Rank AS (
-- Присвоение ранга для каждой группы, исключая группу 0
SELECT
id,
num,
grp,
DENSE_RANK() OVER (ORDER BY grp) as gr
FROM Ranked
WHERE grp <> 0
)
-- Основной запрос, объединяющий таблицу 't' с ранжированной таблицей 'D_Rank'
SELECT
t.id,
t.num,
ISNULL(D_Rank.gr, 0) as group -- Замена NULL на 0 для группы
FROM
t -- имя вашей таблицы
LEFT JOIN D_Rank ON
t.id = D_Rank.id
ORDER BY
t.id;