Объедините тип с соответствующей записью перед удалением записей - PullRequest
0 голосов
/ 12 сентября 2018
DATA have;
infile datalines DELIMITER=','; 
INFORMAT id 2. type $1. date1 date2 MMDDYY10. ; 

INPUT id  date1 type date2;

format date1 date9.
   date2 date9.;
DATALINES;
1,02/09/2012,W,02/09/2012
2,05/16/2012,W,05/18/2012
2,06/18/2012,W,06/18/2012
2,06/18/2012,T,.              < drop: same date
3,08/08/2011,W,08/08/2012
3,09/13/2011,W,09/13/2012
4,06/08/2016,W,06/12/2016
4,06/11/2016,T,.              < drop: between 6/8 and 6/12
5,08/16/2012,W,08/16/2012
5,08/16/2012,W,08/30/2012
5,08/24/2012,T,.           < drop:  btw 8/16 and 8/22
6,09/05/2012,W,09/06/2012
7,09/05/2012,W,09/05/2012
7,09/07/2012,W,09/08/2012
7,08/03/2011,W,08/03/2011
7,05/01/2012,W,05/09/2012
7,04/30/2012,T,.       <keep: as not between       
8,03/31/2017,W,04/01/2017
8,03/06/2017,T,.            
8,03/06/2017,L,.            
8,07/03/2018,T,.
9,02/17/2016,T,.               < drop same day
9,02/18/2016,L,.            < drop between 2/17 and 2/22 day
9,02/17/2016,W,02/22/2016

;
run;

Есть 3 типа W, T, L 1step - если какой-либо тип, кроме W, находится между date1 и date2 для того же идентификатора, тогда запись не должна появляться, но включать новый тип как W & T или W & L в зависимости от удаленной записи типа.

PROC SORT DATA= have;
BY ID DATE1 TYPE  ;
RUN;
proc sql;
create table comb2 as
Select id, date1, type,date2 from have t
  Where type = "W" or 
     not exists(select date1 from have 
                  where id = t.id and t.date1 BETWEEN date1 and date2 and 
      type ="W")
  ;
  run;

но это не добавляет тип, который удаляется, например, если тип T удаляется, то запись соответствующего W должна указывать W & T как новый тип.

2-й шаг в зависимости от указанного значения % let days_btw = 5; затем, в зависимости от макроса, следует использовать & days_btw для удаления любых записей между пределом days_btw и самой ранней записью, которая должна быть сохранена для идентификатора, а остальная часть типа должна быть добавлена, но не хочет добавлять, если даты того же типа .

%Let DAYS_BTW=5;
proc sort data=have; by id date1; run;

data want;
drop date2;
do until(last.id);
set have; by id;
if  missing(lastDate) or 
    intck("day", lastDate1, date1) > &DAYS_BTW or
    lastType = type then do;
        output;
        lastdate1 = date1;
        lasttype = type;
        end;
end;
drop last: ;
run;

это дает записи по желанию, но не добавляет тип как новый тип. Как создать поле new_type с указанием удаляемых записей (например, W & T)

...