У меня есть решение, но оно не самое элегантное (и может не охватывать угловые случаи). Если у кого-то есть лучшее решение, поделитесь.
Во-первых, чтобы создать набор данных на тот случай, если кто-то еще захочет испытать его:
Data work.have;
input @01 ID 3.
@05 Type $1.
@07 Date date7.
@18 Value $1.;
format ID 3.
Type $1.
Date date11.
Value $1.;
datalines;
001 F '02Jan18'n Y
001 B '03Jan18'n
001 B '04Jan18'n Y
001 B '05Jan18'n
001 B '06Jan18'n
001 F '06Jan18'n Y
001 B '06Jan18'n
001 B '07Jan18'n
001 B '08Jan18'n Y
001 B '08Jan18'n
001 B '09Jan18'n
002 F '02Jan18'n Y
002 B '03Jan18'n
002 B '04Jan18'n
;
run;
Решение: Я основываюсь на вашем отредактированном предложении о создании переменной флага.
Data Flag;
set work.have;
if Type = 'B' and Value = 'Y' then
flag + 1;
if Type = 'F' then
flag = 0;
if Value ne 'Y' and flag = 1 then delete;
run;
Значение переменной флага по умолчанию равно 0.
Первое условие IF-Then идентифицирует строки Type B = 'Y' и помечает их как 1, а также сохраняет этот флаг для последующих строк.
Второе условие IF-Then идентифицирует строку type = 'F' и сбрасывает флаг в 0
. Условие Last If-Then отбрасывает все строки с флагом = 1, кроме первого вхождения, которое Тип B = 'Y' строк.
Надеюсь, это относится к вашей проблеме.