Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Merge 在SAS中,对输出数据集进行子集设置是否会与合并数据步骤相冲突?_Merge_Sas - Fatal编程技术网

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;