Sas 删除同一日期的重复记录,但将该类型添加到未删除的记录中

Sas 删除同一日期的重复记录,但将该类型添加到未删除的记录中,sas,Sas,这删除了我想要2 06/18/2012小的记录,但我想要的是,对于未删除的记录,类型应指示大和小,或者是指示大和小的新字段 请注意,当同一天有重复项时,只有类型较小的记录才会被删除。您需要一些逻辑来折叠类型和日期2的多个值 您可以使用数据步骤 DATA table1; infile datalines DELIMITER=','; INFORMAT id 2. type $10. date date2 MMDDYY10. ; INPUT id date type date2; format

这删除了我想要2 06/18/2012小的记录,但我想要的是,对于未删除的记录,类型应指示大和小,或者是指示大和小的新字段
请注意,当同一天有重复项时,只有类型较小的记录才会被删除。

您需要一些逻辑来折叠类型和日期2的多个值

您可以使用数据步骤

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;
如果您真的想坚持使用SQL,并且类型只有两个值,那么您可以将查询转换为联接

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;

注意:作为操作员使用时要小心。它在普通SAS代码中的含义与在SQL代码和WHERE语句中的含义完全不同。

当我运行查询的datastep时,如果存在重复项,它将删除大类型,但如果id有同一天的记录,我只希望删除小类型记录。这可能吗?当两个记录都是TYPE='BIG'时,您是想保留重复记录,还是只想避免NEWTYPE='BIG'?是的,我想避免BIG-BIG,因为日期2不同。当日期介于大记录的日期和日期2之间时,如果我需要删除小记录,这是一个小修复。我曾经将date=t.date之前的日期更改为date和date2之间的t.date?您可以在BY语句中包含TYPE,并且只在catx是第一个.TYPE时执行它。我尝试了这个PROC SORT DATA=table1;按ID日期递减类型;跑数据需求;直到最后一天;设置表1;按id日期类型;长度新类型$25新日期8;如果type=first.type,则newtype=catx'&',newtype,type;newdate=合并日期,newdate;终止日期=新日期;删除newdate;跑错误:按变量在数据集WORK上的排序不正确。表1
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;