Альтернатива функции LAG - PullRequest
0 голосов
/ 11 мая 2018

Мой набор данных структурирован следующим образом:

ID, Order Date, Delivery Date, Flag
1, 10/03/12, 15/03/12, 
1, 17/03/12, 20/03/12, 1

Я хочу иметь возможность рассчитать разницу в датах между первой датой доставки и последующими датами заказа.В конечном итоге цель состоит в том, чтобы сгруппировать эти записи с идентификатором.

Пробовал монотонное () с монотонным () + 1 для самостоятельного объединения, но проблема в том, что каждый идентификатор может иметь несколько разных чисел, нуждающихся в строках.быть сгруппированы вместе.Я использую SAS Enterprise Guide 7 - к сожалению, LAG недоступен.

Пример того, чего я хочу достичь:

ID, Order Date, Deliv Date, Order Date_1, Deliv Date_1, DateDIFF(Deliv Date - Order Date_1)
1, 10/03/12, 15/03/12, 17/03/12, 20/03/12, 2

Есть идеи?

1 Ответ

0 голосов
/ 11 мая 2018

Вам необходимо proc sort данные в порядке убывания на Delivery_Date, затем retain значения предыдущей записи при группировании по ID, чтобы вычислить разницу.

Код:

 data have;
   infile datalines dlm=',' dsd;
   informat id 11. Order_Date ddmmyy8. Delivery_Date ddmmyy8. flag 11.;
   format Order_Date ddmmyy8. Delivery_Date ddmmyy8.;
   input ID Order_Date Delivery_Date Flag;
   datalines;
1, 10/03/12, 15/03/12,.
1, 17/03/12, 20/03/12, 1
2, 10/03/12, 10/03/12,.
2, 17/03/12, 20/03/12, 1
2, 10/03/12, 27/03/12,1
2, 17/03/12, 23/03/12, 1
run;

proc sort data=have; 
  by id descending Delivery_Date ; 
run;

data want;
  set have;
  by id;
  retain nxt_date;
  if first.id=1 then do; 
    nxt_date = Delivery_Date; 
    diff=0; 
  end;
  else do; 
    prv_date=nxt_date;
    diff=nxt_date-Delivery_Date;
    nxt_date = Delivery_Date;
  end;
  format prv_date ddmmyy8.
  drop nxt_date;
run;

Выход:

id=1 Order_Date=17/03/12 Delivery_Date=20/03/12 flag=1 diff=0 prv_date=.
id=1 Order_Date=10/03/12 Delivery_Date=15/03/12 flag=. diff=5 prv_date=20/03/12
id=2 Order_Date=10/03/12 Delivery_Date=27/03/12 flag=1 diff=0 prv_date=.
id=2 Order_Date=17/03/12 Delivery_Date=23/03/12 flag=1 diff=4 prv_date=27/03/12
id=2 Order_Date=17/03/12 Delivery_Date=20/03/12 flag=1 diff=3  prv_date=23/03/12
id=2 Order_Date=10/03/12 Delivery_Date=10/03/12 flag=. diff=10 prv_date=20/03/12
...