Как вычислить совокупную сумму для каждого наблюдения по идентификатору

#sas #ssas #sas-macro #enterprise-guide

#sas #ssas #sas-макрос #enterprise-руководство

Вопрос:

Моя проблема заключается в вычислении совокупной суммы для каждого идентификатора и для каждой даты с учетом скользящего периода в 15 предыдущих дней. Если совокупная сумма превышает 10 кб, переменная 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) =amp;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:

Как насчет этого?

 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 amp; k <= c then cum   p;
      end;
      if cum > 10000 then top   1;
      else top = .;
      output;
   end;

   h.clear();
run;