удалить дубликат записи с той же датой, но добавить тип к тому, который не был удален - PullRequest
0 голосов
/ 07 сентября 2018
DATA table1;
infile datalines DELIMITER=','; 
INFORMAT id 2. type $10. date date2 MMDDYY10. ; 
INPUT id  date type date2;
format date date9.
   date2 date9.;
DATALINES;
1,02/09/2012,BIG,02/09/2012
2,05/16/2012,BIG,05/18/2012
2,06/18/2012,BIG,06/18/2012
2,06/18/2012,SMALL, 
3,08/08/2011,BIG,08/08/2012
3,09/13/2011,BIG,09/13/2012
4,06/08/2016,BIG,06/12/2016
4,06/10/2016,SMALL, 
5,08/16/2012,BIG,08/16/2012
5,08/15/2012,SMALL, 
;
run;

 /*removing same date for an id with different type- only the record with 
 SMALL is REMOVED*/
proc sql;
create table comb as
Select id, date, type,date2 from table1 t
Where type <> "SMALL" or 
not exists(select date from table1 
    where id = t.id and date = t.date and type <> "SMALL");
 run;

![enter image description here это удалило запись, которую я хочу (2 18/18/2012 МАЛЫЙ), но я хочу, чтобы либо тип должен указывать БОЛЬШОЙ & МАЛЕНЬКИЙ для не удаленной записи, либо новое поле, которое указывает БОЛЬШОЙ & МАЛЫЙ enter image description here Обратите внимание, что при наличии дублирования в тот же день удаляется только запись малого типа.

1 Ответ

0 голосов
/ 07 сентября 2018

Вам необходимо иметь некоторую логику, чтобы свернуть несколько значений, как для TYPE, так и для DATE2.

Вы можете использовать шаг данных.

data want ;
  do until (last.date);
    set have ;
    by id date ;
    length newtype $25 newdate2 8;
    newtype=catx(' ',newtype,type);
    newdate2 = coalesce(date2,newdate2);
  end;
  date2=newdate2;
  drop newdate2;
run;

Если вы действительно хотите придерживаться SQL (а для TYPE есть только два значения), вы можете вместо этого преобразовать запрос в объединение.

proc sql noprint;
create table want2 as
select
  coalesce(a.id,b.id) as id
 ,coalesce(a.date,b.date) as date format=date9.
 ,catx(' ',a.type,b.type) as NEWTYPE
 ,coalesce(a.date2,b.date2) as date2 format=date9.
from 
 (select * from have where type='BIG') a
full join
 (select * from have where type='SMALL') b
on a.id = b.id and a.date=b.date
;
quit;

P.S. Будьте осторожны, используя <> в качестве оператора. Он имеет совершенно другое значение в обычном коде SAS, чем в коде SQL и инструкциях WHERE.

...