在SAS中附加数据并在已存在时进行覆盖

时间:2015-02-16 21:27:44

标签: sas

我正在编写一个将数据集附加到现有数据集的宏作业(宏参数是一个日期)。

如果该日期存在,我想覆盖所有这些日期的数据。

解决这个问题的最佳方法是什么?

如果是在SQL中,我会删除插入它们的行。如果您声明了Key,则可以使用某些SQL语言进行替换。我应该对SAS应用类似的理论吗?

2 个答案:

答案 0 :(得分:4)

有很多方法;鉴于不同的需求,没有“最佳”的方式存在。

删除和追加是一种选择。在SAS中,您可能会在PROC APPEND或数据步骤中删除后使用PROC SQL进行追加。这样做的好处是它可以很好地处理多对多类型的关系,但它通常比其他选项慢。

使用简单的datastep合并也是一种有效的方法。如果您的主数据由PK进行排序和/或索引,并且您的附加数据由PK进行排序和/或索引,或者足够小,排序不是很昂贵,这可能是“最快”的方法。这是一个例子:

data class_master;
  set sashelp.class;
  if _n_ < 10;
  origds='Master';
run;

data class_append;
  set sashelp.class;
  where sex='F';
  origds='Append';
run;

proc sort data=class_master;
  by name;
run;

proc sort data=class_append;
  by name;
run;


data class_final;
  merge class_master(in=_m) class_append(in=_a);
  by name;
run;

Merge自然会按照您的要求进行操作 - 它会在找到新记录时添加新记录并更新非新记录。只要master和update表的变量和变量长度相同,如果合并为1:1,它将有效地执行替换和更新(因此BY语句是两个表的主键)并且每个表在该主键上是唯一的)。

Update与merge类似,只是它只用非空数据替换非空数据;因此,如果更新集中的数据行具有某些变量的空(缺失)值,则不会将这些变量基于变量应用于主表。因此,如果需要,请使用UPDATE代替MERGE

您还拥有PROC SQL中提供的所有ANSI SQL技术,即使用UNION保留唯一记录,DELETE/INSERT组合删除和插入等;没有MERGE INTO(在数据步骤中)或大多数其他非ANSI SQL概念。

答案 1 :(得分:1)

另一种方法是使用by处理和last.(或first.,具体取决于要求。)

实施例

data have1 ;
  input date date9. val 8. ;
datalines ;
01feb2015 10
04feb2015 2
10feb2015 16
;
run ;

data have2 ;
  input date date9. val 8. ;
datalines ;
02feb2015 12
04feb2015 18
11feb2015 21
;
run ;

data append ;
  set have1 
      have2 ;
  by date ;
  if last.date ;
run ;
/* Result : 
01feb2015 10
02feb2015 12
04feb2015 18
10feb2015 16
11feb2015 21
*/