如何通过 id 计算每个观察的累积总和

时间:2021-01-13 10:31:37

标签: sas ssas sas-macro enterprise-guide

我的问题是计算每个 ID 和每个日期的累计金额,同时考虑到前 15 天的滑动期。如果累计和超过 10k,则变量 top 递增。

仅对 Juen 进行治疗。

以下是所需结果的示例:

id  app_date    price   cum top 
1   29-juin-20  4000                 4 000  .
1   13-juin-20  5000               45 000   1
1   13-juin-20  6000               40 000   2
1   11-juin-20  7000               34 000   3
1   10-juin-20  8000               27 000   4
1   01-juin-20  9000               19 000   5
1   30-mai-20   10000              10 000   .

proc sort data = tab out= tab1;
by id descending app_date;

run;



data tab2;

set tab1;

%let annee=2020;

%let month=06;

by  id;

retain last_date date_last_d CUM;

if first.id then do;

      last_date =app_date;

      date_last_dem = app_date;

      CUM=0;

end;

if month(date_last_d) =&month. then do ;

diff= date_last_d -app_date;

CUM= price+ CUM;

end;

if diff>15 then do;

      diff = .;

      CUM =.;

      last_date =app_date;

      date_last_d = app_date;

end;

if last.id and CUM>10000 then top= top+1 ;

output;

last_date=app_date;

format last_date DDMMYY10.;

format date_last_d DDMMYY10.;

format CUM 14.2;



run;

我可以在第一次迭代时做到,但我不能对所有行都做到。

1 个答案:

答案 0 :(得分:0)

这个怎么样?

data have;
input Cnt Price ID App_date :ddmmyy10.;
format App_date ddmmyy10.;
datalines;
1  2265 534    30/05/2020
2  2330 4594   27/06/2020
3  1360 723    14/05/2020
4  1393 723    14/05/2020
5  2400 101666 12/06/2020
6  2411 101666 12/06/2020
7  2400 101666 11/06/2020
8  2400 101666 11/06/2020
9  2527 101666 10/06/2020
10 2536 101666 10/06/2020
11 2458 101666 04/06/2020
12 2758 1088   30/05/2020
13 4412 1056   13/06/2020
14 1870 1255   30/06/2020
15 4198 1255   14/05/2020
;

data want(drop = c k p dt);

   dcl hash h(ordered : "Y");
   h.definekey("c");
   h.definedata("c", "p", "dt");
   h.definedone();
   dcl hiter i("h");

   do c = 1 by 1 until (last.ID);
      set have(rename=(App_Date=dt Price=p));
      by ID notsorted;
      h.add();
   end;

   do k = 1 by 1 until (last.ID);
      set have;
      by ID notsorted;
      cum = 0;
      do while (i.next() = 0);
         if App_Date - 15 <= dt <= App_Date & k <= c then cum + p;
      end;
      if cum > 10000 then top + 1;
      else top = .;
      output;
   end;

   h.clear();
run;
相关问题