Hi @Abimal_Zippi
Sorry, I selected it as attachment, but didn't check. This time I use a code box:
/******************************************************************************/
/* RensInterval erlu 29.1.2013 */
/* */
/* Makroen anvendes til rensning af SAS-datasæt, hvor de enkelte records */
/* udtrykker tidsintervaller angivet ved en startdato og en slutdato. */
/* */
/* Makroen læser et angivet datasæt og danner et outputdatasæt, hvor */
/* flere poster med tidsintervaller i umiddelbar fortsættelse eller overlap- */
/* pende er komprimeret til eet interval. */
/* */
/* Makroen checker, om datasættet indeholder flere poster, hvor alle */
/* variabelværdier er fælles bortset fra tidsintervallet, og hvor */
/* tidsintervallerne er fortløbende eller overlappende, således at startdato */
/* på en følgende post er <= dagen efter slutdato på den foregående post. */
/* De resulterende intervalvariable får samme format som formatet på den */
/* variabel, der er angivet son datefirst. */
/* */
/* Kaldsargumenter: */
/* */
/* Positionelle: */
/* Inputdatasæt */
/* */
/* Outputdatasæt */
/* */
/* Keyword: */
/* Datefirst=datefirst Anvendes kun hvis varnavn ikke er datefirst */
/* */
/* Datelast=datelast Anvendes kun hvis varnavn ikke er datelast */
/* */
/******************************************************************************/
%macro RensInterval(thisinds,thisoutds,datefirst=DateFirst,datelast=DateLast);
%local dropstmt datofmt SelectList WhereList datofmtstr;
%* Check eksistens af inputdatasæt;
%if %sysfunc(exist(&thisinds)) = 0 %then %do;
%put ERROR: Inputdataset &thisinds findes ikke;
%goto wexit;
%end;
%let GeneratedKey = qxzworkid;
%let dropstmt = drop &GeneratedKey;
%let ContentDs = qxw1;
proc datasets nolist;
delete qxw1 qxw2 qxw3;
quit;
%* Dan datasæt med variabelspecifikationer;
proc contents data=&thisinds noprint short out=&ContentDs;
run;
%* initier datoformat;
%let datofmt = %str();
%* dan makrovariable ud fra proc contents;
data _null_; set &ContentDs end=eof;
length SelectList WhereList $4096 fmt $60;
retain SelectList WhereList;
retain DatoVarChk 0;
if lowcase(name) NE lowcase("&datefirst") and lowcase(name) NE lowcase("&datelast") then do;
SelectList = catx(',', SelectList, name);
WhereList = catx(' AND ', wherelist, 'a.'||trim(name)||'=b.'||trim(name));
end;
%* fang format på datefirst;
if lowcase(name) = lowcase("&datefirst") then do;
if lowcase(format) = 'date' and formatl = 0 then fmt = 'DATE.';
else if lowcase(format) = 'datetime' and formatl = 0 then fmt = 'DATETIME.';
else do;
fmt = trim(format)||strip(put(formatl,8.0))||'.';
if formatd > 0 then fmt = trim(fmt)||strip(put(formatd,8.0));
end;
call symputx('datofmt',fmt);
end;
%* fang de 2 datointervalvariable i datasættet;
if lowcase(name) = lowcase("&datefirst") then DatoVarChk = DatoVarChk + 1;
else if lowcase(name) = lowcase("&datelast") then DatoVarChk = DatoVarChk + 1;
if eof then do;
call symput('SelectList',trim(SelectList));
call symput('WhereList',trim(WhereList));
call symputx('DatoVarChk',trim(DatoVarChk));
end;
run;
%* stop ved manglende datovariable;
%if &DatoVarChk ne 2 %then %do;
%put ERROR: Manglende intervalvariable - &datefirst eller &datelast ikke fundet i datasæt: &thisinds;
%goto wexit;
%end;
%* dan datoformatstreng til at sætte format op outputdatoer;
%if &datofmt = %str(0.) %then %let datofmtstr = %str();
%else %do;
%let datofmtstr = format qxnewfirst qxnewlast &datofmt;
%put NOTE: Format til output-intervalvariable: &datofmt;
%end;
%put NOTE: SelectList = &SelectList;
%put NOTE: WhereList = &WhereList;
%* dan id-nummereret distinct liste over variable (undtagen datovariable);
proc sql;
create table qxw2 as
select
monotonic() as &GeneratedKey,
&SelectList
from (select distinct &SelectList from &thisinds as b) as a
order by &GeneratedKey;
quit;
%* flet id-numrene ind på hele datasættet og sorter;
proc sql;
create table qxw3 as
select
a.*,
b.&GeneratedKey
from &thisinds as a, qxw2 as b
where &WhereList
order by &GeneratedKey, &datefirst, &datelast;
quit;
%* Dan resulterende intervaller;
data &thisoutds(rename=(qxnewfirst=&datefirst qxnewlast=&datelast));
set qxw3; by &GeneratedKey;
retain qxnewfirst qxnewlast;
&datofmtstr;
drop &datefirst &datelast;
&dropstmt;
if first.&GeneratedKey then do;
qxnewfirst = &datefirst;
qxnewlast = &datelast;
end;
else do;
if &datefirst > qxnewlast + 1 then do;
output;
qxnewfirst = &datefirst;
qxnewlast = &datelast;
end;
else if &datelast > qxnewlast then qxnewlast = &datelast;
end;
if last.&GeneratedKey then output;
run;
%wexit:
proc datasets nolist;
delete qxw1 qxw2 qxw3;
quit;
%mend;
... View more