如何在SAS中比较两个表以匹配列的值?

如何在SAS中比较两个表以匹配列的值?,sas,Sas,我有一个约40000000个唯一/不同条目的源表和一个约80000000个唯一/不同条目的新表,每个表都有一列 我需要在新表中创建一个标志列,如果源表中也存在相应观测的唯一项(有匹配项),则该列显示1,如果没有匹配项,则显示0 我如何才能最有效地进行这项工作 使用proc sql是不可避免的,还是可以单独使用SAS解决?要向数据集添加新变量,需要创建新数据集。假设数据已经在键变量上排序,只需执行合并。您可以使用IN=dataset选项检查哪些数据集为合并贡献了观测值 data want ;

我有一个约40000000个唯一/不同条目的源表和一个约80000000个唯一/不同条目的新表,每个表都有一列

我需要在新表中创建一个标志列,如果源表中也存在相应观测的唯一项(有匹配项),则该列显示1,如果没有匹配项,则显示0

我如何才能最有效地进行这项工作


使用proc sql是不可避免的,还是可以单独使用SAS解决?

要向数据集添加新变量,需要创建新数据集。假设数据已经在键变量上排序,只需执行合并。您可以使用IN=dataset选项检查哪些数据集为合并贡献了观测值

data want ;
  merge new(in=innew) old(in=inold);
  by key_var;
  if innew;
  new_var = inold;
run;

要向数据集添加新变量,需要创建新的数据集。假设数据已经在键变量上排序,只需执行合并。您可以使用IN=dataset选项检查哪些数据集为合并贡献了观测值

data want ;
  merge new(in=innew) old(in=inold);
  by key_var;
  if innew;
  new_var = inold;
run;

以下是我的解决方案供您参考:

/*step1: create a new dataset containing unique values of your new table*/
data new1;
    set you_new_table(keep=var1 var2 var3...varx);
proc sort nodup;
    by var1 var2 var3...varx;
run;

/*step2: create a new dataset containing unique values of your old table*/
data old1;
    set you_old_table(keep=var1 var2 var3...varx);
proc sort nodup;
    by var1 var2 var3...varx;
run;

/*step3: merge the two table that just created (inner join)*/
data compare1;
    merge old1(in=a) new1(in=b);
    by var1 var2 var3...varx;
    if a and b;
proc sort;
    by var1 var2 var3...varx;
run;

/*step4: merge the inner join dataset with the new source table and generate the flag*/
data new2;
    set you_new_table;
proc sort;
    by var1 var2 var3...varx;
run;

data new3;
    /*merge new2(in=a) new1(in=b); sry, a mistake, shame.*/
    merge new2(in=a) compare1(in=b);
    by var1 var2 var3...varx;
    if a;
    if b then flag=1;
    else flag=0;
run;

以下是我的解决方案供您参考:

/*step1: create a new dataset containing unique values of your new table*/
data new1;
    set you_new_table(keep=var1 var2 var3...varx);
proc sort nodup;
    by var1 var2 var3...varx;
run;

/*step2: create a new dataset containing unique values of your old table*/
data old1;
    set you_old_table(keep=var1 var2 var3...varx);
proc sort nodup;
    by var1 var2 var3...varx;
run;

/*step3: merge the two table that just created (inner join)*/
data compare1;
    merge old1(in=a) new1(in=b);
    by var1 var2 var3...varx;
    if a and b;
proc sort;
    by var1 var2 var3...varx;
run;

/*step4: merge the inner join dataset with the new source table and generate the flag*/
data new2;
    set you_new_table;
proc sort;
    by var1 var2 var3...varx;
run;

data new3;
    /*merge new2(in=a) new1(in=b); sry, a mistake, shame.*/
    merge new2(in=a) compare1(in=b);
    by var1 var2 var3...varx;
    if a;
    if b then flag=1;
    else flag=0;
run;

谢谢,我创建了一个有50和100个值的虚拟数据集。一个小的修正,在“data new3;”之后的行中,我认为应该是“compare1”而不是“new1”。你看到过大数据集有什么问题吗?还有,创建新数据的目的是什么?@Rohit 1)“数据新3”后面的那行是我的错误。我已经修复了,谢谢你指出。@Rohit 2)dataset new2是新源表的排序版本。merge语句要求所有数据集按相同的键变量排序。谢谢,这对我创建的具有50和100个值的虚拟数据集有效。一个小的修正,在“data new3;”之后的行中,我认为应该是“compare1”而不是“new1”。你看到过大数据集有什么问题吗?还有,创建新数据的目的是什么?@Rohit 1)“数据新3”后面的那行是我的错误。我已经修复了,谢谢你指出。@Rohit 2)dataset new2是新源表的排序版本。merge语句要求所有数据集按相同的键变量排序。