Слияние данных, если A не B - PullRequest
0 голосов
/ 13 ноября 2018

В настоящее время я запускаю SQL, чтобы получить ежедневную позицию около 650 тыс. Счетов. У меня есть 2 кода, которые покажут мне все учетные записи, которые были исключены из списка по сравнению с предыдущим днем, или те, которые были добавлены в список с предыдущего дня.

Я делаю это следующим образом;

data MOVECHECK121118Drop;
merge MOVECHECK091118(in=a)
MOVECheck121118(in=b);
If A and not B;
Run;

data MOVECHECK121118Gain;
merge MOVECHECK091118(in=a)
MOVECheck121118(in=b);
If B and not A;
Run;

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

Я предполагаю, что я делаю что-то не так в коде ??

Любая помощь с благодарностью,

1 Ответ

0 голосов
/ 13 ноября 2018

В шаге слияния SAS вы почти всегда включаете оператор BY, в котором перечислены переменные для слияния (например, SQL-соединение).Ваш код будет выглядеть следующим образом:

data MOVECHECK121118Drop ;
  merge MOVECHECK091118(in=a)
        MOVECheck121118(in=b) 
  ;
  by SomeIDvariable ;
  if A and not B;
run;

Оператор IF поднабора будет выбирать записи, которые находятся в MOVECHECK091118, но в MOVECheck121118 нет соответствующего значения SomeIDvariable.

Без оператора BY SAS выполняетпоследовательное слияние («smush»), слияние первой записи каждого набора данных, второй записи каждого набора данных и т. д. Нет идентификатора переменной для сопоставления.

Многие люди считают, что слияние без BYОператор должен выдавать ошибку.Если вы согласны, вы можете установить options mergenoby=error;.Это приведет к ошибке, если вы случайно забудете инструкцию BY.

...