Как использовать процедуру сравнения для обновления набора данных

Я хочу использовать 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;
Другие вопросы по тегам