Can be done in one data step. Still ignoring public holidays?
data work.have;
length CustomerName $ 10 TechVisitDay 8;
format TechVisitDay ddmmyyp10.;
informat TechVisitDay date.;
input CustomerName TechVisitDay;
datalines;
John 02JAN2012
John 03JAN2012
John 05JAN2012
John 06JAN2012
John 09JAN2012
Mary 02JAN2012
Mary 03JAN2012
Sam 03JAN2012
Sam 04JAN2012
;
run;
data work.want;
set work.have;
by CustomerName;
length
lastVisit saved day missingStart missingEnd 8
Flag $ 20;
retain lastVisit;
if first.CustomerName then do;
/* get first monday */
missingStart = nwkdom(1, 2, month(TechVisitDay), year(TechVisitDay));
end;
else do;
missingStart = intnx('DAY', lastVisit, 1);
end;
missingEnd = intnx('DAY', TechVisitDay, -1);
saved = TechVisitDay;
do day = missingStart to missingEnd;
/* 1 = Sunday, 7 = Saturday */
if 1 < weekday(day) < 7 then do;
TechVisitDay = day;
Flag = 'No Visit';
output;
end;
end;
Flag = ' ';
TechVisitDay = saved;
output;
lastVisit = TechVisitDay;
keep CustomerName TechVisitDay Flag;
run;
... View more