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