Jest to forma problemu luk i wysp. Możesz przypisać każde 0
grupę, licząc liczbę wartości niezerowych przed nią. Następnie agregować.
Jednak tabele SQL reprezentują nieuporządkowane zestawy. Nie ma kolejności, chyba że kolumna określa kolejność. Założę, że masz. Następnie:
select count(*)
from (select t.*,
sum(values <> 0) over (partition by idnumber order by <ordering col>) as grp
from t
) t
where values = 0
group by idnumber, grp;