Если вы собираетесь использовать утверждение типа
VarSummary + 1 ;
OR
VarSummary + <expression> ;
тогда вам на самом деле не нужен оператор RETAIN.
Кроме того, если вы используете оператор BY в DATA STEP, у вас есть доступ к переменным FIRST и LAST (данные должны быть отсортированы по переменной BY). FIRST и LAST имеют значение 1 или 0. Когда переменная BY находится на первом значении FIRST. = 1 и когда оно находится на последнем значении LAST. = 1. Они оба могут быть равны 1, когда имеется только 1 запись byVariable, и они могут быть равны 0, когда существует более 2 записей byVariable (когда в средних записях).
FIRST и LAST могут помочь определить, когда нужно сбрасывать переменные RETAINed. (FIRST и LAST будут в PDV, но не будут записаны в выходной набор данных, поэтому нет необходимости удалять их).
Пример
(Результат этого примера, вероятно, будет сделан с помощью PROC, но я надеюсь, что это демонстрирует, как можно использовать FIRST и LAST)
proc sort data=sasuser.laguardia out=work.dest;
by dest ;
run ;
data work.destination_summary (keep=dest dest_count total_count) ;
set work.dest ;
by dest ;
total_count + 1 ;
if first.dest then dest_count = 1 ;
if not first.dest and not last.dest then dest_count + 1 ;
if last.dest then do ;
dest_count + 1 ;
output ;
end ;
run ;
proc print data=work.destination_summary label noobs ;
var dest dest_count total_count;
label Dest="Destination"
dest_count="Count"
total_count= "Total Count";
run ;