2014-10-17 3 views
2

proc compare을 사용하여 매일 데이터 세트를 업데이트하고 싶습니다. proc를 사용하여 데이터 세트를 업데이트하는 방법

work.HAVE2

Date  Key Var1 Var2 
01Aug2013 K1 a 3 
01Aug2013 K2 a 3 
02Aug2013 K1 b 4 
03Aug2013 K2 c 1 

DateKey

Date  Key Var1 Var2 
01Aug2013 K1 a 2 
01Aug2013 K2 a 3 
02Aug2013 K1 b 4 

work.HAVE1

고유 한 레코드를 결정한다. 나는 위의 두 테이블을 사용할 수있는 방법 를 구성하는 내가 이전 데이터를 삭제 한 후 다시 작성하지 않으려는

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에 새로운 변화 (불평등 한 기록)를 제공 할 것입니다. 자신을 바꾼 새로운 대 vs를 구별해야합니다.

그러나 달성하려는 목표는 실제로는 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 WORK.NEW 테이블을 대상으로 할 수 있습니다.

WORK.CHANGED의 경우 - MODIFY 또는 UPDATE 문을 사용하여 레코드를 업데이트하십시오. 변경 사항의 크기에 따라 이전 레코드를 삭제하려면 PROC SQL; DELETE, 새 값을 추가하려면 PROC APPEND을 생각해 볼 수도 있습니다.

+0

언급하는 것을 잊었다. 'Have1'은 실제로 서버에 있고 'Have2'는 로컬 서버입니다. 'Merge'는 대형 데이터 세트에 더 많은 처리 시간이 필요할 수 있습니다. – Lovnlust

+0

@GMTG 이것은 'HAVE1'의 '로컬'복사본을 유지하거나 변경 될 수있는 최소한 HAVE1의 부분을 유지할 때 더 효과적입니다. 로컬 드라이브에 마스터 데이터 세트의 복사본을 보관할 수 없으면 많은 이점이 있습니다 (어쨌든 많은 네트워크 전송으로 끝남). – Joe

+0

@vasja'new'는 그냥 추가 할 수 있습니다. '변경됨 '을 위해, 나는'merge'를 하나 더 필요로합니다. – Lovnlust

0

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; 
+0

'have1'은 (는) 네트워크에 있습니다. 'have2'는 로컬입니다. 대용량 데이터와 함께 이와 같은 데이터 단계를 사용하면 용납 할 수없는 성능이 발생합니다. – Lovnlust

+0

Keith,이 질문은 이전 질문과 관련이 있습니다. 여기서 중요한 것은 최소한의 네트워크 전송으로 업데이트를 수행 할 수 있다는 것입니다 (따라서 proc은 업데이트 할 레코드를 식별하기 위해 비교됩니다). – Joe

+0

어떤 경우에는 HAVE1에 인덱스를 만든 다음 MODIFY를 사용하여 HAVE2로 인덱스를 업데이트하는 것이 어떻습니까? 지금 코드를 작성할 시간이 없지만이 기사를 살펴 보겠습니다. 특히 KEY = Option 및 SET 문을 사용하여 수정하십시오. http://www2.sas.com/proceedings/sugi31/264-31.pdf – Longfish

관련 문제