2014-01-08 46 views
1

我在谷歌上找不到任何東西。動態第一次觀察:需要在firstobs中添加變量=

我有一個數據組,並需要遍歷它在組塊, 第一個塊將是: firstobs = 1個觀測值= 30000 第二塊將是: firstobs = 30001個觀測值= 60000 第三: firstobs = 60001 obs = 90000

等等......

這可能嗎? 我該如何寫這樣的東西?

編輯

我有這樣的數據,對數百萬條記錄的工作:

data _null_; 
     set all_include_Stornos ; 
     IF TREATMENT_IND = 1 AND DDS_ROW_IND NE 1 THEN DO; 
     CALL EXECUTE ('%STORNO_TKUFA ('||POLICY_RK||');'); 
     CALL EXECUTE ('%UPDATE (STORNO_TKUFA_CUMULATE);'); 
     END; 
     IF TREATMENT_IND in (4) AND DDS_ROW_IND NE 1 THEN DO; 

      CALL EXECUTE ('%HAKPAA ('||POLICY_RK||','||POLICY_VERSION||');'); 
      call execute ('%UPDATE(HAKPAA_CUMULATE);'); 


     END; 

     IF TREATMENT_IND = 5 AND DDS_ROW_IND NE 1 and count_bitul_no <2 or (count_bitul_no >1 and max_bitul_ver = policy_verSion) THEN DO; 
      CALL EXECUTE ('%BITUL ('||POLICY_RK||','||POLICY_VERSION||');'); 
      CALL EXECUTE ('%UPDATE(BITUL_CUMULATE);'); 

     END; 

     IF TREATMENT_IND = 6 AND DDS_ROW_IND NE 1 THEN DO; 
     CALL EXECUTE ('%LAST_STATE ('||POLICY_RK||','||POLICY_VERSION||');'); 
     CALL EXECUTE ('%UPDATE (LAST_STATE_calc);'); 
     END; 

     IF DDS_ROW_IND NE 1 and ((PREV_TREATMENT_IND = 4 AND TREATMENT_IND NOT IN (1,2,5)) or treatment_ind = 3) THEN DO; 
      CALL EXECUTE ('%HAFSHARA ('||POLICY_RK||','||POLICY_VERSION||');'); 
      CALL EXECUTE ('%UPDATE (HAFSHARA_CUMULATE);'); 
     END; 

      IF TREATMENT_IND = 2 AND POLICY_VERSION - 1 = max_bitul_ver AND DDS_ROW_IND NE 1 THEN DO; 
     CALL EXECUTE ('%STORNO_BITUL ('||POLICY_RK||','||POLICY_VERSION||');'); 
     CALL EXECUTE ('%UPDATE (STORNO_BITUL_CUMULATE);'); 
     END; 
RUN; 

所建議的論壇的成員, 因爲順路執行的工作的, 我需要拆分數據分塊,所以程序不會崩潰,因爲它到目前爲止,

所以我想到一個循環採取firstobs並增加了30K每個和每一次迭代。

問題是,我不能讓firstobs與可變的工作至今

+0

你能給我們提供更多關於你想要做什麼的信息嗎?有多種方式來處理這個問題,但這取決於你想要什麼。 – DomPazz

+0

謝謝DomPazz的回覆。希望現在能更容易地理解我的問題。再次感謝。 – user2518751

回答

1

寫宏來完成你想要的。

%macro loop(max,by); 
%do i=%eval(1+&by) %to &max %by &by; 

data _null_; 
set all_include_Stornos(firstobs=%eval(&i-&by) obs=&i); 
... 
run; 
%end; 
%mend; 
%loop(90001,30000) 

編輯:實現我應該解釋如何fisrtobs =和obs =工作。基本上,它從記錄「firstobs」開始,到「obs」結束。所以你使用一個宏循環從30000到1 90001。這樣你一次只能處理30K條記錄。如果您需要減小塊大小,則可以隨時更改宏中的「by」值。

+0

工程就像一個魅力。非常感謝DomPazz! – user2518751