日期之间求和行的 SAS 代码

SAS Code for summing lines between dates

所以我有这样的数据

 obs | date_of_service | units | CPT | ID
 -----------------------------------------
  1. |   11/03/2015    |   40  |xxxx6| 234
  2. |   11/04/2015    |    1  |xxxx5| 234
  3. |   11/11/2015    |    1  |xxxx5| 234
  4. |   11/18/2015    |    1  |xxxx5| 234
  5. |   11/20/2015    |   40  |xxxx6| 234
  6. |   11/25/2015    |    1  |xxxx5| 234
  7. |   12/02/2015    |    1  |xxxx5| 234
  etc.... 

在许多 ID 的许多时间间隔内, 我需要做的是对每个间隔的 CPT xxxx6 之间的 obs 单位求和,因为它是一个非常大的数据集,具有许多唯一 ID。

好的,这就是我现在拥有的:

%MACRO lags();
   %let n=1;
   data out;
      set in;
      by id  Date_of_service ;
      DO _n_=&n. until (last.id);
         if (id=lag&n.(id) and CPT="xxxx6") then do;
            if units ne . then output;
            call missing (TOTAL);
         end;
         if CPT="xxxx5" or CPT= "xxxx7" then TOTAL + count;
      END;
   run;
%MEND;
%lags

问题是,如果我连续有两个或多个 xxxx6,中间没有 xxxx5 或 xxxx7,我会得到空 (.) 值或 TOTAL 列中的 0。而且我没有得到所有带有 xxxx6 cpt 的 ID 的第一条观察线。

已编辑答案,因为我不知道如何 post 一个新答案: 查找 CPT="xxx6" 并在该点存储变量。然后通过下一行求和单元直到到达下一个 xxx6 并在重复之前输出。如果最后一组观察没有达到 xxx6,这将导致问题。另外,如果 ID 从 234 变为 235 中间单元计数会怎样?在解决方案中,将采用 234 作为 ID 求和。

data In;
infile cards;
input OBS DATE_OF_SERVICE:mmddyy10. UNITS CPT:. ID;
format DATE_OF_SERVICE date9.;
cards;
1 11/03/2015 40 xxxx6 234
2 11/04/2015 1 xxxx5 234
3 11/11/2015 1 xxxx5 234
4 11/18/2015 1 xxxx5 234
5 11/20/2015 41 xxxx6 234
6 11/25/2015 1 xxxx5 234
7 11/25/2015 1 xxxx5 234
8 11/25/2015 45 xxxx6 234
;
run;

data OUT(drop=ID UNITS DATE_OF_SERVICE OBS
rename=(STORE_UNITS=UNITS STORE_ID=ID STORE_DATE=DATE_OF_SERVICE STORE_OBS=OBS));
set IN;
retain STORE_OBS STORE_DATE STORE_UNITS STORE_ID;
if CPT="xxxx6" then do;
    if STORE_UNITS ne . then output;
    call missing (TOTAL);

    STORE_UNITS=UNITS;
    STORE_DATE=DATE_OF_SERVICE;
    STORE_ID=ID;
    STORE_OBS=OBS;
end;
if CPT="xxxx5" then TOTAL+UNITS;
run;

proc print; run;