Great article Rick!
I just saw a typo that I didn't want to overlook!

Here we have to retain the 'first' variable is it?

data SystematicSample;
call streaminit(123); /* Set the random number seed */
retain start;
set Have;
if _N_ = 1 then
first = rand("Integer", 1, 20); /* select a starting position */
if mod(_N_ - first, 20) = 0; /* select 'first' and every 20th obs after */
run;