Here's a select that will give you the values needed, now you just need to merge them.
WITH connected as (
SELECT ID
,LAG(ID,1) OVER(ORDER BY ID) PREVID
,VAL
,CNT
FROM Table1
)
,CTE(ID,VAL,CNT) as (
SELECT ID
,VAL
,CNT
FROM connected
WHERE PREVID IS NULL
UNION ALL
SELECT c.ID
,NVL(NULLIF(c.VAL,0),CTE.VAL) VAL
,c.CNT
FROM connected c
JOIN CTE
ON CTE.ID = c.PREVID
)
SELECT ID,VAL,CNT
FROM CTE