Merge 在SAS中,对输出数据集进行子集设置是否会与合并数据步骤相冲突?
使用Merge 在SAS中,对输出数据集进行子集设置是否会与合并数据步骤相冲突?,merge,sas,Merge,Sas,使用merge语句合并两个数据集时,在创建输出数据集时对其进行子集划分是否合适 简而言之,这两种方法中哪一种更好 (A) (B) 根据我的经验,我见过一种情况,使用方法a会导致错误的合并,而方法B肯定会成功。我试图向更广泛的团队解释这一点,但找不到任何文档 我认为,在merge语句中创建数据集时,删除行或子设置数据集会在某种程度上破坏后台运行的合并过程。有人能帮我解释一下或给出正确答案吗?我相信你提到的“绝对成功”应该是: data merge_output; merge mer
merge
语句合并两个数据集时,在创建输出数据集时对其进行子集划分是否合适
简而言之,这两种方法中哪一种更好
(A)
(B)
根据我的经验,我见过一种情况,使用方法a会导致错误的合并,而方法B肯定会成功。我试图向更广泛的团队解释这一点,但找不到任何文档
我认为,在merge语句中创建数据集时,删除行或子设置数据集会在某种程度上破坏后台运行的合并过程。有人能帮我解释一下或给出正确答案吗?我相信你提到的“绝对成功”应该是:
data merge_output;
merge
merge_input1 (in = ina)
merge_input2 (in = inb)
;
by some_column;
if ina and inb and some_other_column eq 'Y';
run;
在SAS工作了14年,我相信我从未在输出数据集上使用过where
选项
上面使用的IF
语句(不带则)称为子集IF
,但它并不是真正的输出子集(像一些后期操作),它只是不允许一些输入记录继续完成数据步骤的其余部分并最终进入输出数据集
关于选项A)使用DELETE
语句可能比IF
语句更能“告诉”您正在做什么,并且可以在不使用OUTPUT
语句的情况下使用,因此您也可以更明确地这样做:
data merge_output;
merge
merge_input1 (in = ina)
merge_input2 (in = inb)
;
by some_column;
if ina and inb; /* "inner join" */
if some_other_column ne 'Y' then delete; /* subset */
run;
根据我的经验,OUTPUT
语句常常导致忘记将其添加到所有IF。。然后。。ELSE..
分支以获得预期结果。规则是,一旦使用OUTPUT语句,在数据步骤的末尾就不会自动输出记录,因此必须处理所有需要的记录。
因此,在使用多个输出数据集时,我尝试只使用OUTPUT
语句。两者都不使用!如果必须使用数据步骤,则应该更早而不是更晚使用WHERE Data set选项。我假设在merge\u input\u表1中已经有其他列。如果在其他表格中,则根据需要移动/复制
WHERE data set选项和语句过滤不需要的数据行。这将减少处理,因为不需要的行将从PDV中排除
data merge_output ;
merge
merge_input1 (in = ina where = (some_other_column = 'Y'))
merge_input2 (in = inb)
;
by some_column;
if ina and inb;
run;
在指出风险和意外结果时,使用数据步骤执行合并。过滤可能会隐式地卷入处理过程,导致意外结果。SQL的风险要小得多,因为它是显式的。您定义了所需内容,SQL引擎将确定获取该内容的最佳方式
proc sql;
create table merge_output as
select *
from merge_input1
inner join
merge_input2
on merge_input1.some_column eq merge_input2.some_column
where some_other_column eq 'Y'
;
quit;
data merge_output ;
merge
merge_input1 (in = ina where = (some_other_column = 'Y'))
merge_input2 (in = inb)
;
by some_column;
if ina and inb;
run;
proc sql;
create table merge_output as
select *
from merge_input1
inner join
merge_input2
on merge_input1.some_column eq merge_input2.some_column
where some_other_column eq 'Y'
;
quit;