#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;