Я пытаюсь вычислить новое поле на основе существующих полей с использованием SAS. Я пробовал функцию задержки, но не работал. Ниже приведены данные и программа, которые я пробовал.Вычислить новую переменную на основе существующих переменных с помощью SAS
необработанных данных:
cust_id Prdct_No no_of_mnths Actual_Shp_Dt граф
х 12 2 8/1/2014 10
х 12 1 8/11/2014 10
х 12 0 8/23/2014 10
у 13 2 8/1/2014 10
у 13 1 8/11/2014 10
у 14а 2 8/1/2014 10
у 14а 1 8/11/2014 10
у 14а-8/21/2014 10
z 15 3 9/1/2014 20
z 15 2 15/15/2012 20
Требуемые результаты:
Target_Ship_Dt является суммой (лаг (Actual_Shp_Dt) и задержка (Count)) сгруппированы по Cust_ID и Prdct_No. Если Actual_Shp_Dt задерживается или раньше target_shp_Dt, тогда Target_Shp_Dt является SUM (отставание (Target_Shp_Dt) и отставание (Count)).
cust_id Prdct_No no_of_mnths Actual_Shp_Dt граф Target_Ship_Dt
х 12 2 8/1/2014 10
х 12 1 8/11/2014 10 8/11/2014
х 12 0 8/23/2014 10 8/21/2014
у 13 2 8/1/2014 10
у 13 1 8/11/2014 10 8/11/2014
у 14а 2 8/1/2014 10
у 14а 1 8/11/2014 10 8/11/2014
y 14a 0 8/21/2014 10 21.08.2012
z 15 3 9/1/2014 20
z 15 2 15/15/2012 20 9/21/2014
Code Я пробовал:
Data Raw_Data (падение = Prdct_ID_lag Actual_Shp_Dt_lag Count_Lag Target_Shp_Dt1);
Set Raw_Data;
By Cust_ID Prdct_ID;
Prdct_ID_lag = lag (Prdct_ID);
Формат Actual_Shp_Dt_lag date9;
Actual_Shp_Dt_lag = lag (Actual_Shp_Dt);
Count_Lag = lag (Count);
Формат Target_Shp_dt date9;
Если Prdct_ID ~ = Prdct_ID_lag, тогда Actual_Shp_Dt_lag =.;
Если Prdct_ID ~ = Prdct_ID_lag, тогда Count_Lag =.;
Target_Shp_Dt1 = Actual_Shp_Dt_lag + Count_Lag;
Target_Shp_Dt = Target_Shp_Dt1;
Если Actual_Shp_Dt> Target_Shp_Dt1, тогда Target_Shp_Dt = Target_Shp_Dt1 + Count_lag;
Если Actual_Shp_Dt < Target_Shp_Dt1 Тогда Target_Shp_Dt = Target_Shp_Dt1 + Count_lag;
Run;
Но этот код не дал мне правильных результатов.
Любая помощь будет оценена по достоинству.
Попробовав новый код: данные:
Cust_ID Prdct_No no_of_mnths Actual_Shp_Dt Граф Target_Ship_Dt
х 12 2 8/1/2014 10
х 12 1 8/11/2014 10 8/11/2014
х 12 0 8/23/2014 10
у 13 2 8/1/2014 10
у 13 1 8/11/2014 10 8/11/2014
у 14а 2 8/1/2014 10
y 14a 1 8/11/2014 10 8/11/2014
y 14a 0 8/21/2014 10 8/21/2014
г 15 3 9/1/2014 20
г 15 2 9/15/2014 20
Код, который работал:
данных Raw_Data (падение = Prdct_ID_lag Actual_Shp_Dt_lag Count_Lag Target_Shp_Dt1);
Set Raw_Data;
By Cust_ID Prdct_ID;
Cust_ID_lag = lag (Cust_ID);
Prdct_ID_lag = lag (Prdct_ID);
Формат Actual_Shp_Dt_lag Target_Shp_Dt date9;
Actual_Shp_Dt_lag = lag (Actual_Shp_Dt);
Count_Lag = lag (Count);
keep target_shp_dt_lag;
Если Cust_ID = Cust_ID_lag и Prdct_ID = Prdct_ID_lag и target_shp_dt_lag =.
Затем Target_Shp_Dt = Actual_Shp_Dt_lag + Count_Lag;
ELSE IF Cust_ID = Cust_ID_lag и Prdct_ID = Prdct_ID_lag
Тогда Target_Shp_Dt = target_shp_dt_lag + Count_Lag;
ELSE Target_Shp_Dt =.;
target_shp_dt_lag = Target_Shp_Dt;
Run;
Возможно, вы могли бы дважды проверить ожидаемый target_shp_dt для последней строки в данных вашего примера? – user667489