匹配合并SAS数据集差异

匹配合并SAS数据集差异,sas,dataset,Sas,Dataset,我在SAS有个问题。通常如何确定两个数据集中的差异?下面是我使用的代码。这就是我用来确定记录是否在一个数据集中而不是另一个数据集中的方法。例如,如果某个运行代码的人获得了更高或更低的记录计数。我正在寻找其他的选择。谢谢 PROC SORT DATA=IVT.REQ_1_3_17 OUT=lob.REQ_1_3_17i; BY ACCT_NB DAY_TIME_DIM_NB TXN_AM TXN_POSTING_SEQ CS_TXN_CD REQ_1_3_EXCL; RUN;

我在SAS有个问题。通常如何确定两个数据集中的差异?下面是我使用的代码。这就是我用来确定记录是否在一个数据集中而不是另一个数据集中的方法。例如,如果某个运行代码的人获得了更高或更低的记录计数。我正在寻找其他的选择。谢谢

 PROC SORT DATA=IVT.REQ_1_3_17  OUT=lob.REQ_1_3_17i;
     BY ACCT_NB DAY_TIME_DIM_NB TXN_AM  TXN_POSTING_SEQ CS_TXN_CD REQ_1_3_EXCL;
 RUN;

PROC SORT DATA=lob.REQ_1_3_17  OUT=lob.REQ_1_3_17l;
  BY ACCT_NB DAY_TIME_DIM_NB TXN_AM TXN_POSTING_SEQ CS_TXN_CD REQ_1_3_EXCL;
RUN;

DATA lob.MISMATCHES_1;
MERGE lob.REQ_1_3_17i(IN =A) lob.REQ_1_3_17l(IN=B);
BY ACCT_NB  DAY_TIME_DIM_NB TXN_AM TXN_POSTING_SEQ  CS_TXN_CD REQ_1_3_EXCL;
IF A AND NOT B;
RUN; 

有很多方法可以找到两个数据集中的差异。标准的是PROC COMPARE,它有一个OUT选项来保存数据集中的所有差异。您可以使用特殊选项仅输出不同的值:

proc compare    
    base=lob.REQ_1_3_17i
    comp=lob.REQ_1_3_17l
    out=differences
    outDif outBase outComp outNoEqual
    ;
run;
有一个由过程生成的自动宏变量,称为SYSINFO。使用它,您可以了解一般类型的差异,而无需查看外部数据集。有关详细信息,请参阅

在差异数据集中,您可以找到有关比较的详细信息。“\u TYPE”变量显示差异的类型。当其值为DIF时,值之间存在差异。如果一个数值变量不同,它只包含两个值之间的差异。如果字符变量是different,您将得到类似“.X..X..”的结果,这意味着两个值在第二个和第五个字符中存在差异

好吧,这听起来不错,直到您的数据有不同数量的记录或不同的ID变量。为此,您应该使用ID语句,以便在比较之前对值进行分组

proc compare    
   .....;
   id acct_nb;
run;
在现实生活中,我并不经常使用proc compare,除非它是最终的比较。我通常不需要知道详细程度,只需要选择一些具有不同值的ID变量。Merge语句是解决这个问题的一种方法,但我更喜欢使用SQL。想法是统一两个数据集,然后使用catx为每个记录创建一个唯一的“ID”变量,然后在每个数据集中搜索它

proc SQL;
    create table differences as
    select distinct idVar1, idVar2, idVar3
    from data1 natural full join data2
    where 
    catx('@',idVar1, idVar2, ...., var1, var2, ...)
        not in (select catx('@',idVar1, idVar2, ...., var1, var2, ...) from data1)
    or
    catx('@',idVar1, idVar2, ...., var1, var2, ...)
        not in (select catx('@',idVar1, idVar2, ...., var1, var2, ...) from data2)
    ;
quit;

注意:此方法不会捕获完整的重复项,因此,如果您的数据可以包含这些重复项,并且了解这些重复项很重要,请使用其他方法。您还需要记住,最大字符串值为32767,如果其中一个变量只能包含该字符,请将“@”替换为其他字符(例如“$@”)。有关该主题的论文,请参阅@user667489的链接。