Hiya, this will get you close but my interval differs from yours. I also put in code to only count the overlap duration once but it's a bit messy:
data have;
set have;
end_taking_date = sum(starting_taking_date,Days_of_supply,-1);
run;
proc sort data = have;
by id drug starting_taking_date end_taking_date;
run;
data have;
set have;
lag_id = lag(id);
lag_start = lag(starting_taking_date);
run;
data have (drop = lag_id lag_start);
set have;
nomid = _n_;
if id = lag_id then
interval = sum(starting_taking_date,-lag_start);
run;
*get overlap;
proc sql;
create table want_tmp as
select m.nomid, max(p.starting_taking_date,m.starting_taking_date) as share_start_tmp,
min(p.end_taking_date,m.end_taking_date) as share_end_tmp, p.id as sharer_id
from have as M, have as P
where m.drug ne p.drug
and m.id = p.id
and (P.starting_taking_date <= M.end_taking_date and P.end_taking_date >= M.starting_taking_date);
quit;
proc sql;
create table want (drop = nomid) as
select l.*,coalesce(r.share_start_tmp,l.starting_taking_date) as share_start_tmp ,
coalesce(r.share_end_tmp,l.end_taking_date) as share_end_tmp, r.sharer_id
from have as l left join want_tmp as r
on l.nomid=r.nomid;
quit;
data want;
set want;
format share_start_tmp share_end_tmp ddmmyy10.;
if sharer_id ne '' then
overlap_tmp = sum(share_end_tmp,-share_start_tmp,1);
run;
proc sort data = want;
by id share_start_tmp share_end_tmp;
run;
data want (drop = overlap_tmp sharer_id share_start_tmp share_end_tmp);
set want;
format share_start share_end end_taking_date mmddyy10.;
by id share_start_tmp share_end_tmp;
if sharer_id ne '' and first.share_start_tmp then
overlap = overlap_tmp;
if sharer_id ne '' then do;
share_start = share_start_tmp;
share_end = share_end_tmp;
end;
run;
proc sort data = want;
by id drug share_start share_end;
run;
cheers
Steve
... View more