2013-10-03 3 views
1

이 질문은 내 이전 question의 후속 조치입니다. 해시 객체를 사용하여 병합하는 것 외에도 동일한 데이터베이스 내에서 조회를 수행 할 때 해시 객체와 관련하여 고민하고 있습니다.SAS : 동일한 데이터베이스 내에서 해시 객체 조회

Client Order_number New_number 
XYZ 1000   1001 
     1001   1002 
ABC 1006   1009 
     1009   1017 
SST 1010   1011 
     1017   1020 
     1020   1030 
     1011   1050 

은 마찬가지로 내 이전의 질문에, 나는 다음이 필요합니다 : 즉

Client Order_number New_number 
XYZ 1000   1001 
XYZ 1001   1002 
ABC 1006   1009 
ABC 1009   1017 
SST 1010   1011 
ABC 1017   1020 
ABC 1020   1030 
SST 1011   1050 

를, 클라이언트 이름 클라이언트의 order_number에 대한 지속적인 업데이트가 어디이 데이터베이스가 가 없으면 order_number를 사용하여 이전 new_number와 일치시켜 클라이언트를 찾습니다. 주문은 먼저 order_numbernew_number 순으로 정렬됩니다.

필자는 이전 질문에 게시 된 코드를 일부 변경했지만 성공하지 못하도록 코드를 작성하려고합니다.

답변

3

데이터가 SAS 데이터 세트 인 경우 작동합니다. 이 예제는 기존 데이터 집합으로 다시 씁니다. 클라이언트가 알려진 모든 관찰에서 필터를 수행 한 다음 클라이언트가 비어있는 동안 해시를 사용하여 순서 번호 체인을 반복합니다.

data orders (keep=c o n rename=(c=client o=order_number n=new_number)); 
length client $8 order_number 8 new_number 8; 
* declare hash object; 
if _n_ = 1 then do; 
    declare hash h(dataset:'orders'); 
    h.definekey('order_number'); 
    h.definedata('client','new_number'); 
    h.definedone(); 
    call missing(client, order_number, new_number); 
end; 
* set statement with rename of original column names; 
set orders (rename=(order_number=o new_number=n client=c) where=(c ne '')); 
* find in hash ; 
rc = h.find(key:n); 
* write first observation; 
output; 
* do loop through chain of order numbers while client is empty; 
do while (rc = 0 and client = ''); 
    * update values of output dataset; 
    o = n; 
    n = new_number; 
    rc = h.find(key:n); 
    * write current observation; 
    output; 
end; 
run; 
+0

와우 그 위대한 작품! 고맙습니다. 나는 무슨 일이 일어나는지 이해할 수 있도록 줄을 서려고 노력 중이다. – Plug4

+0

왜'set' 문에'where = (c ne ''));가 필요합니까? – Plug4

+1

여기서 클라이언트가 알려진 관측치를 선택합니다. 이것은 체인의 시작이며 클라이언트가 알려지지 않은 한 반복됩니다. 이를 제거하면 결과에 중복 주문 번호가 표시됩니다. 복제본에는 여전히 클라이언트 ID가 누락됩니다. –