在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几乎相同,并且如果数据集在结构上确实相同,并且在合并步骤中没有进行其他处理,那么将给出相同的结果)。