To eliminate overlaps and fill in the gaps (if that's what you want) :
data have;
input PatID $ FacID $ clm_from_dt :mmddyy. clm_thru_dt :mmddyy.;
format clm: yymmdd10.;
datalines;
002 43517 2/1/2018 3/31/2018
002 40002 2/10/2018 2/11/2018
002 42168 2/12/2018 2/22/2018
002 43517 4/1/2018 5/31/2018
002 40002 4/5/2018 4/7/2018
002 43517 6/1/2018 7/31/2018
;
data want;
array f {%sysevalf("31dec2017"d, integer) : %sysevalf("01jan2019"d,integer) } $8;
f{lbound(f)} = "xxxx";
f{hbound(f)} = "xxxx";
do until(last.patId);
set have; by patId;
do d = clm_from_dt to clm_thru_dt;
f{d} = FacId;
end;
end;
do d = "01jan2018"d to "31dec2018"d;
if f{d} ne f{d-1} then do;
facId = f{d};
clm_from_dt = d;
end;
if f{d} ne f{d+1} then do;
clm_thru_dt = d;
output;
end;
end;
keep patId facId clm_from_dt clm_thru_dt;
run;
proc print; run;
Obs. PatID FacID clm_from_dt clm_thru_dt
1 002 2018-01-01 2018-01-31
2 002 43517 2018-02-01 2018-02-09
3 002 40002 2018-02-10 2018-02-11
4 002 42168 2018-02-12 2018-02-22
5 002 43517 2018-02-23 2018-04-04
6 002 40002 2018-04-05 2018-04-07
7 002 43517 2018-04-08 2018-07-31
8 002 2018-08-01 2018-12-31
... View more