2016-04-12 3 views
1

Мне нужно объединить три таблицы, каждая таблица имеет между 100K -200K записей. Это слияние занимает почти пять минут. Мне нужна помощь для преобразования кода ниже в хеш-соединение. Спасибо заранее.sas hash join vs data step merge

data &dsource..main_input; 
    merge &dsource..sorted_swf (in=here1) 
     &dsource..sorted_input2 (in=here2) 
     &dsource..sorted_input9 (in=here3); 
    by control; 
    if (here1) then do; 
     %recode_div  

     if typec = 45 then elig_hu= '1';  
     else if (status eq '1') or ((status in ('2','3')) and (type in ('1','2','4','6','10','11'))) then elig_hu = '1'; 
     else if (status eq '4') then do; 
     if (noint in (1,2,3,5,6)) then elig_hu = '1'; 
     else if (noint eq 4) or (10 <= noint <= 43) then elig_hu = '0'; 
     end; 
     else if (status in ('2','3')) and (type in ('5','7','8','9'))   then elig_hu = '0'; 
     else elig_hu = '9'; 
     output; 

     keep var1 var2 var3 var4; 
    end; 
run; 

data want; 
    set finput.input2; 
    if _n_ = 1 then do; 
     %create_hash(in2,control,region,"ftest5.swf"); 
     %create_hash(in9,control,hudadmin,"ftest5.input9"); 
    end; 
    /*<initialize lookup variables>*/ 
    rc = in2.find(); 
    rc = in9.find(); 
    if rc then do; 
     /* <handle case where lookup fails>*/ 
    end; 
    drop rc; 
run; 
+1

Если вы только держать переменная1-var4 почему вы возитесь с расчетами? – Reeza

ответ

0

захватить% create_hash() макрос из here

общего пользования является

data want; 
set have; 
format <new variables to look up>; 

if _n_ = 1 then do; 
    %create_hash(obj,keyvar1 keyvar2 ..., lookupvar1 lookupvar2 ..., "lookup data set"); 
end; 

<initialize lookup variables> 
rc = obj.find(); 

if rc then do; 
    <handle case where lookup fails> 
end; 

drop rc; 
run; 
+0

Что такое 'формат <новые переменные для поиска>;' оператор в верхней части кода вашего примера делает? Вы пытаетесь указать, что переменные должны быть определены до создания хэша? Если это так, вы должны использовать 'LENGTH' или' ATTRIB' для определения переменных. – Tom

+0

@ Тома, почему? Если цель определяет переменную, и вы не заботитесь о ярлыках и т. Д., Что вы покупаете 'ATTRIB'? Оба они обрабатываются во время компиляции и помещают переменную в PDV. – DomPazz

+0

Обычно я использую 'LENGTH' для определения переменной, но вы также можете использовать' ATTRIB'. Но 'FORMAT' предназначен для прикрепления форматов, а не для определения переменных. Как установить длину символьной переменной с помощью инструкции FORMAT? Если вы постоянно прикрепляете формат к символьной переменной, вы можете получить очень странные результаты после слияния таблиц. Что делать, если вы хотите, чтобы SAS выбирал формат для отображения ваших числовых переменных? – Tom

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