2016-10-26 5 views
0

본질적으로 데이터 세트를 두 개 (ID가없는 ID와 누락 된 ID)로 분할하여 누락 된 부분을 ID를 채울 수 있도록 일치하는 키 집합. 나는 다섯 개의 총 레코드를 가지고 있으며, 마지막 데이터 셋은 다섯 개의 레코드를 모두 유지해야합니다. 비 누락 된 데이터 CPOOLSAS : 누락 된 데이터를 병합하거나 결합하여 모든 레코드를 보유하십시오.

. M123 
. M456 

:

DATA TEST; 
    LENGTH ID MKEY $12.; 
    INPUT ID $ MKEY $; 
    DATALINES; 
    . M123 
    . M456 
    A M123 
    B M456 
    C M789 
    ; 
RUN; 

DATA MPOOL CPOOL; SET TEST; 
    IF ID IN ("","0") THEN DO; 
     MISS_ID = 1; 
     OUTPUT MPOOL; 
    END; 
    ELSE DO; 
     MISS_ID = 0; 
     OUTPUT CPOOL; 
    END; 
RUN; 

그래서 우리는 누락 된 데이터 MPOOL 병합 결국 :

A M123 
B M456 
C M789 

에만 병합을 나에게 세 가지 기록을 제공합니다 다음은 예입니다 모든 레코드를 유지하고 누락을 채울 필요가 있습니다 (MKEY를 통해 누락 된 ID에 A 레코드와 B 레코드를 연결해야 함). w :

A M123 
A M123 
B M456 
B M456 
C M789 

SQL JOIN 어떤 종류의 나에게 모든 기록을 유지하고 성공적으로 결합되어 그들과 함께 실종을 채울 수 있도록 것인가? 가능하지만이 데이터가있는 MERGE은 모든 레코드를 보유하지 않습니다. 나는이 예제에서 지연/유지/채우기를 할 수 있지만, 작업중인 큰 데이터는 다른 요인으로 인해 병합/결합이 필요합니다.

답변

1

한 방법과 union alljoin를 사용

proc sql; 
    select c.id, c.mkey 
    from cpool c 
    union all 
    select c.id, m.mkey 
    from mpool m join 
     cpool c 
     on m.mkey = c.mkey; 
+0

유망한 고든이 보입니다. 감사합니다. 경고 : 경고 : UNION ALL 집합 연산을 수행하기 위해 테이블이 널 열로 확장되었습니다. 경고 : MKEY라는 열은 select 식 (또는 뷰)에 복제됩니다. ' 경고 : 변수 MKEY가 이미 WORK.MERGED 파일에 있습니다.' – Foxer

+0

@Foxer. . . 이것이 결과에 영향을 줍니까? –

+0

예, 나는 233,836 개의 레코드를 기대하고 있으며 233,598 개의 레코드 만 출력하고 있습니다. – Foxer

0

또한 ID에 기입하는 데이터 단계를 사용하려고.

proc sort data=test; 
by mkey descending id; 
run; 

data want; 
    set test; 
    retain temp; 
    by mkey id notsorted; 
    if first.mkey then temp=id; 
    if missing(id) then id=temp; 
    drop temp; 
run; 
+0

필자는이 예제에서 retain을 사용하여 작동하도록 할 수 있음을 언급했지만 다른 여러 변수와 요인으로 인해 병합/결합을 사용해야한다고 설명했습니다. – Foxer