Совпадение слияний SAS - PullRequest
0 голосов
/ 26 октября 2018

У меня есть вопрос в 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; 

1 Ответ

0 голосов
/ 27 октября 2018

Существует множество способов найти различия в двух наборах данных.Стандартным является 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.С его помощью вы можете понять общий тип различий, не заглядывая в набор данных OUT.Подробнее см. SAS help .

В наборе отличий вы можете найти подробную информацию о сравнении.Переменная « _TYPE_ » показывает тип различия.Когда его значение равно DIF, существует разница в значениях.Если числовая переменная отличается, она просто будет содержать разницу между двумя значениями.Если символьная переменная отличается, вы получите что-то вроде «.X..X ...», что означает, что два значения имеют различие во втором и пятом символах.

Ну, все это звучит хорошо, покаваши данные имеют разное количество записей или разные переменные идентификатора.Для этого вы должны использовать оператор ID, чтобы значения сравнивались перед сравнением.

proc compare    
   .....;
   id acct_nb;
run;

В реальной жизни я не использую метод сравнения сравнений так часто, если только это не окончательное сравнение.Мне обычно не нужно знать этот уровень детализации, а просто нужно выбрать переменные идентификатора, которые имеют разные значения.Оператор слияния является одним из способов ее решения, но я предпочитаю использовать SQL.Идея состоит в том, чтобы объединить два набора данных, а затем создать уникальную переменную 'ID' для каждой из записей, используя catx, а затем найти ее в каждом из наборов данных.

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, и заменить '@' чем-то другим (например, '$ @ `'), если одна из ваших переменных может содержать только этот символ.

...