Combine intersecting ranges to produce new ranges based on the points of intersection
My guess

select ID, valid_from
  , lead(valid_from,1,'31.12.2999') over (partition by id order by valid_from) as valid_to
  , case Item_a when '-' then lag(Item_a,1,'-') over (partition by id order by valid_from) else Item_a end as Item_a
from t