我正在编写一个将数据集附加到现有数据集的宏作业(宏参数是一个日期)。
如果该日期存在,我想覆盖所有这些日期的数据。
解决这个问题的最佳方法是什么?
如果是在SQL中,我会删除插入它们的行。如果您声明了Key,则可以使用某些SQL语言进行替换。我应该对SAS应用类似的理论吗?
答案 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 */