在SAS中追加数据并在数据已存在时覆盖
我正在编写一个宏作业,将数据集附加到现有数据集(宏参数是日期) 如果该日期存在,我希望覆盖所有这些日期的数据 解决这个问题的最佳方法是什么在SAS中追加数据并在数据已存在时覆盖,sas,Sas,我正在编写一个宏作业,将数据集附加到现有数据集(宏参数是日期) 如果该日期存在,我希望覆盖所有这些日期的数据 解决这个问题的最佳方法是什么 如果是在SQL中,我会删除行并插入它们。某些SQL语言允许您在声明密钥时替换为。我是否应该将类似的理论应用于SAS?有很多方法;鉴于不同的需求,不存在“最佳”方式 删除和追加是一个选项。在SAS中,在PROC SQL或数据步骤中删除后,您可能会使用PROC APPEND进行追加。这样做的优点是它可以很好地处理多对多类型关系,但通常比其他选项慢 使用简单的da
如果是在SQL中,我会删除行并插入它们。某些SQL语言允许您在声明密钥时替换为。我是否应该将类似的理论应用于SAS?有很多方法;鉴于不同的需求,不存在“最佳”方式 删除和追加是一个选项。在SAS中,在
PROC SQL
或数据步骤中删除后,您可能会使用PROC APPEND
进行追加。这样做的优点是它可以很好地处理多对多类型关系,但通常比其他选项慢
使用简单的datastep合并也是一种有效的方法。如果主数据由主键排序和/或索引,并且附加数据由主键排序和/或索引,或者排序足够小,那么这可能是“最快”的方法。这并不昂贵。下面是一个例子:
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;
数据类\u主控;
设置sashelp.class;
如果<10;
origds='Master';
跑
数据类追加;
设置sashelp.class;
其中sex='F';
origds='Append';
跑
proc sort data=类\主;
按姓名
跑
proc sort data=class\u append;
按姓名
跑
最终数据类;
合并类\主(in=\ m)类\附加(in=\ a);
按姓名
跑
Merge
自然地满足您的要求—当找到新记录时,它会添加新记录,并更新非新记录。只要master和update表的变量和变量长度相同,如果merge是1:1(因此BY语句是由两个表的主键生成的,并且每个表在主键上是唯一的),那么它将有效地执行与replace和update相同的操作
Update
与merge类似,不同之处在于它仅用额外的非空数据替换非空数据;因此,如果更新集中的数据行中某些变量的值为空(缺少),则这些值将不会逐个变量应用于主表。因此,如果需要,请使用UPDATE
而不是MERGE
您还可以在
PROC SQL
中使用所有ANSI SQL技术,即使用UNION
保存唯一记录,DELETE/INSERT
组合删除和插入等。;没有合并到
(即在数据步骤中)或大多数其他非ANSI SQL概念。另一种方法是通过处理和最后使用。
(或首先。
,取决于要求)
范例
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
*/
数据表1;
输入日期日期9。瓦尔8;
数据线;
2015年2月1日10
2015年2月4日2
2015年2月10日16
;
跑
数据集2;
输入日期日期9。瓦尔8;
数据线;
2015年2月2日12
2015年2月4日18
2015年2月11日21
;
跑
数据附加;
集have1
have2;
按日期;
若为最后日期;
跑
/*结果:
2015年2月1日10
2015年2月2日12
2015年2月4日18
2015年2月10日16
2015年2月11日21
*/
不要忘记,这与排序(或索引)的合并有同样的需要。您可能想解释它与merge的区别(它与merge几乎相同,并且如果数据集在结构上确实相同,并且在合并步骤中没有进行其他处理,那么将给出相同的结果)。