在使用merge
语句合并两个数据集时,是否可以在创建输出数据集时对其进行子集化?
简而言之,这两种方法中的哪一种更好?
A)
data merge_output;
merge
merge_input1 (in = ina)
merge_input2 (in = inb)
;
by some_column;
if ina and inb;
if some_other_column eq 'Y' then output merge_output;
else delete;
run;
B)
data merge_output (where = (some_other_column = 'Y'));
merge
merge_input1 (in = ina)
merge_input2 (in = inb)
;
by some_column;
if ina and inb;
run;
根据我的经验,我已经看到使用方法A导致错误合并的情况,而方法B确实是成功的。我试图向更广泛的团队解释这一点,但找不到任何文档。
我认为在合并语句中创建数据集时删除行或子设置数据集会以某种方式搞砸在后台运行的合并过程。有人可以帮我解释一下或正确答案吗?
答案 0 :(得分:1)
我相信你提到的“确定的成功”将是:
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
语句(没有THEN
)被称为subsetting 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 .. THEN .. ELSE..
分支以获得预期结果。规则是,一旦使用OUTPUT语句,在数据步骤结束时就不会自动输出记录,因此您必须处理所需的所有记录。
所以我尝试在使用多个输出数据集时只使用OUTPUT
语句。
答案 1 :(得分:1)
既不!如果必须使用“数据”步骤,则应先使用WHERE数据集选项,而不是稍后使用。我假设some_other_column已经在merge_input_table1中。如果它在另一个表中,则根据需要移动/复制。
WHERE数据集选项和语句可过滤不需要的数据行。这减少了处理,因为从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;