Во-первых, переменные FIRST.ID и LAST.ID не создаются на шаге данных, если вы не включили идентификатор переменной в инструкцию BY.
Во-вторых, это прикрепление последней даты к каждому наблюдению. вам нужно обработать данные дважды. Ваш текущий код (если добавлен оператор BY) будет присваивать значение LAST_DATE только в последнем наблюдении группы по.
Один из способов сделать это - пересортировать данные по убыванию даты в каждом затем по группам вы можете использовать BY ID, FIRST.ID и RETAIN.
proc sort data=have;
by id descending date;
run;
data want;
set have;
by id descending date;
if first.id then last_date=date;
retain last_date;
format last_date ddmmyy10.;
run;
Вот способ использования исходного порядка сортировки с использованием так называемого двойного DOW l oop. Размещая операторы SET / BY внутри DO l oop, вы можете прочитать все наблюдения для группы за один проход шага данных. Затем вы добавляете второй DO l oop, чтобы повторно обработать эту группу BY и использовать информацию, вычисленную в первом l oop, и записывать наблюдения.
data want;
do until (last.id);
set have;
by id;
end;
last_date=date ;
format last_date ddmmyy10.;
do until (last.id);
set have;
by id;
output;
end;
run;