Here's a version that doesn't rely on dropping or re-naming data set variables: A couple of notes: Missing values for character variables are represented by a blank. Data set variable names can only contain letters, numbers and underscores. This is one solution: data question; ID = 1; Cycle = 1; Date = '1/01/2016'; output; ID = 1; Cycle = 2; Date = '2/02/2016'; output; ID = 1; Cycle = 3; Date = ''; output; ID = 2; Cycle = 1; Date = ''; output; ID = 2; Cycle = 2; Date = ''; output; ID = 2; Cycle = 3; Date = ''; output; ID = 3; Cycle = 1; Date = '3/04/2016'; output; ID = 3; Cycle = 2; Date = '4/12/2016'; output; ID = 3; Cycle = 3; Date = '5/06/2016'; output; ID = 3; Cycle = 4; Date = ''; output; ID = 4; Cycle = 1; Date = ''; output; ID = 5; Cycle = 1; Date = '8/16/2015'; output; ID = 5; Cycle = 2; Date = '9/01/2016'; output; run; %macro a; proc sort data=question; by ID Cycle; run; proc sql noprint; select count(distinct(ID)) into:distinct_IDs from question; quit; %do i = 1 %to &distinct_IDs.; proc sql noprint; create table unique_id as select * from question where ID = &i.; select count(*) into:TOTAL from unique_id; select count(*) into:MISSING from unique_id where Date = ''; quit; %if &MISSING. gt 0 and &TOTAL. ne &MISSING. %then %do; data _null_; set unique_id; if Date ne '' then call symput('last_date', Date); run; proc sql noprint; update question set Date = "&last_date." where Date = '' and ID = &i.; quit; %end; %end; %mend a; %a; Thank you, John
... View more