This looks like an appliaction for a dow loop:
data want (keep=id1 st1 enddate rename=(id1=id st1=startdate));
format id1 st1 enddate; /* just to keep the vars in order */
do until ((startdate - lastdate >= 28) or finish);
lastdate = startdate;
set have end=finish;
by id;
if first.id then lastdate = startdate;
end;
if startdate - lastdate >= 28
then do;
do until (lastdate = st1 and id = id1); /* read to the first record */
set have (rename=(id=id1 startdate=st1));
end;
output;
do until (startdate = st1 and id = id1); /* read to the second record */
set have (rename=(id=id1 startdate=st1));
end;
output;
end;
run;