2013-10-03 3 views
1

Этот вопрос является продолжением моих предыдущих question. Помимо выполнения слияния с использованием хеш-объектов, я борюсь с Hash Objects, когда дело доходит до поиска в одной базе данных. У меня есть эта база данных, где происходит непрерывное обновление до order_number клиента:SAS: Hash Object Поиск в той же базе

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 для сопоставления с предыдущим номером new_number, чтобы найти клиента. Заказы сначала сортируются по order_number, а затем new_number.

Я пытаюсь получить код с некоторыми изменениями кода, опубликованного в моем предыдущем вопросе, но без успеха.

ответ

3

Это должно работать, если ваши данные представляют собой набор данных SAS. В этом примере перезаписывается существующий набор данных. То, что происходит, это фильтр во всех наблюдениях, где клиент известен, а затем цикл через цепочку ordernumbers, используя хэш, пока клиент пуст.

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

Почему '' where = (c ne '')); 'необходимо в' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Plug4

+1

Где выбрать наблюдения, где клиент известен. Это начало цепочки, и он будет зацикливаться до тех пор, пока клиент неизвестен. При удалении это приведет к дублированию порядковых номеров в вашем выходе. Дубликаты также будут пропускать идентификатор клиента. –

Смежные вопросы