Как использовать процедуру сравнения для обновления набора данных
Я хочу использовать proc compare
обновлять набор данных ежедневно.
work.HAVE1
Date Key Var1 Var2
01Aug2013 K1 a 2
01Aug2013 K2 a 3
02Aug2013 K1 b 4
work.HAVE2
Date Key Var1 Var2
01Aug2013 K1 a 3
01Aug2013 K2 a 3
02Aug2013 K1 b 4
03Aug2013 K2 c 1
Date
а также Key
однозначно определяют одну запись. Как я могу использовать две приведенные выше таблицы для построения следующих
work.WANT
Date Key Var1 Var2
01Aug2013 K1 a 3
01Aug2013 K2 a 3
02Aug2013 K1 b 4
03Aug2013 K2 c 1
Я не хочу удалять предыдущие данные, а затем перестраивать их. я бы хотел modify
через добавление новых записей внизу и настройку значений в VAR1
или же VAR2
, Я борюсь с proc compare
но это просто не возвращает то, что я хочу.
2 ответа
proc compare base=work.HAVE1 compare=work.HAVE2 out=WORK.DIFF outnoequal outcomp;
id Date Key;
run;
Это даст вам новые и измененные (неравные записи) в одном наборе данных WORK.DIFF. Вы должны будете различать новые и измененные сами.
Однако то, что вы хотите достичь, на самом деле MERGE
- вставляет новые, перезаписывает существующие, хотя, возможно, по причинам производительности и т. д. вы не хотите заново создавать полную таблицу.
data work.WANT;
merge work.HAVE1 work.HAVE2;
by Date Key;
run;
Edit1:
/* outdiff option will produce records with _type_ = 'DIF' for matched keys */
proc compare base=work.HAVE1 compare=work.HAVE2 out=WORK.RESULT outnoequal outcomp outdiff;
id Date Key;
run;
data WORK.DIFF_KEYS; /* keys of changed records */
set WORK.RESULT;
where _type_ = 'DIF';
keep Date Key;
run;
/* split NEW and CHANGED */
data
WORK.NEW
WORK.CHANGED
;
merge
WORK.RESULT (where=( _type_ ne 'DIF'));
WORK.DIFF_KEYS (in = d)
;
by Date Key;
if d then output WORK.CHANGED;
else output WORK.NEW;
run;
Edit2:
Теперь вы можете просто APPEND
РАБОТА. НОВОСТЬ к целевой таблице.
Для РАБОТЫ. ИЗМЕНЕНО - либо используй MODIFY
или же UPDATE
заявление на обновление записей. В зависимости от размера изменений, вы также можете подумать о PROC SQL; DELETE
удалить старые записи и PROC APPEND
добавить новые значения.
Все, что сделает PROC COMPARE, расскажет вам разницу между двумя наборами данных. Для достижения вашей цели вам нужно использовать оператор UPDATE на шаге данных. Таким образом, значения в HAVE1 обновляются с помощью HAVE2, где совпадают дата и ключ, или добавляется новая запись, если совпадений нет.
data have1;
input Date :date9. Key $ Var1 $ Var2;
format date date9.;
datalines;
01Aug2013 K1 a 2
01Aug2013 K2 a 3
02Aug2013 K1 b 4
;
run;
data have2;
input Date :date9. Key $ Var1 $ Var2;
format date date9.;
datalines;
01Aug2013 K1 a 3
01Aug2013 K2 a 3
02Aug2013 K1 b 4
03Aug2013 K2 c 1
;
run;
data want;
update have1 have2;
by date key;
run;