Questa è una forma di problema delle lacune e delle isole. Puoi assegnare ogni 0
un gruppo contando il numero di valori diversi da zero prima di esso. Quindi aggrega.
Tuttavia, le tabelle SQL rappresentano non ordinate imposta. Non c'è ordinamento a meno che una colonna non specifichi l'ordinamento. Suppongo che tu ne abbia uno. Quindi:
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;