动态第一次观察:需要在firstobs中放置一个变量=

时间:2014-01-08 05:44:45

标签: sas

我在谷歌上找不到任何东西。

我有一个数据集,需要以块的形式迭代它, 第一块将是: firstobs = 1 obs = 30000 第二块将是: firstobs = 30001 obs = 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; 

根据论坛成员的建议, 因为Call Executed的工作方式, 我需要将数据拆分成块,因此程序不会崩溃,就像现在一样,

所以我想到了一个循环取第一个firstobs并在每次迭代时将它增加30K。

问题是,到目前为止我无法使用firstobs来处理变量

1 个答案:

答案 0 :(得分: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 = work的工作原理。基本上,它从记录“firstobs”开始,以“obs”结束。因此,您使用宏循环从1到90001到30000.这样您一次只能处理30k记录。如果需要减小块大小,可以随时更改宏中的“by”值。