先看一下SPEC中關(guān)于這兩個變量生成邏輯:
這兩個變量含義很容易理解,就是基線值。編程思路是在基線記錄中生成BASE/BNRIND,再保留到該P(yáng)ARAMCD中的其他記錄中。我們看一下代碼:BASE(Baseline Value):AVAL where ABLFL=Y per parameter
BNRIND(Baseline Reference Range Indicator):ANRIND where ABLFL=Y per parameter

生成ABLFL后,在每一個PARAMCD中,按ABLFL降序排序。這樣情況下,基線記錄ABLFL=‘Y’,非基線記錄ABLFL為空。因此,基線記錄就排在首行了,接著把首行記錄值(BASE/BNRIND)retain下來,使得非基線記錄含有基線記錄的變量值。
這里有一個注意點:
if ablfl = 'Y' then do; base_= aval; bnrind_=anrind; end;
if first.paramcd then do; base = base_; baseadt; bnrind=bnrind_; end;
這里為什么不直接?
if first.paramcd and ablfl = 'Y' then do; base = aval; baseadt; bnrind=anrind; end;
這里要談到ablfl的定義了:
For each parameter, set to Y for the last record (sort by ADT in ascending order) with AVAL not null and ATPT null and NULL< ADT <=ADSL.TRTSDT
定義為基線值的記錄,AVAL值必須是非空。如果某一PARAMCD中,AVAL都為空值,即ablfl也都為空值。這時候運(yùn)行到“if first.paramcd and ablfl = 'Y' then do;”這一步就不執(zhí)行下面的賦值語句了,這樣會產(chǎn)生賦值錯誤??赡苡腥藭f,這樣不是正好嗎?變量BASE保留基線記錄的值,如果這個PARAMCD內(nèi)AVAL都為空,沒有基線,所以就不用賦值了。這種思路沒問題,可是具體到SAS語句的運(yùn)行時,如果不執(zhí)行賦值語句的話,RETAIN語句會繼續(xù)起作用,變量BASE記錄的就是上一個PARAMCD的BASE值了。而在條件為“if first.paramcd then do;”情況下,在某一PARAMCD內(nèi),沒有基線記錄時也會進(jìn)行賦值語句,只不過賦值是空值。因為不符合上一步條件ablfl = 'Y', BASE_ 已經(jīng)被賦值為空值。這就保證無基線記錄時,該P(yáng)ARAMCD內(nèi)的BASE值為空,不會是前一個PARAMCD的值。
這個例子對于我們有一個很好的啟示,我們再理解變量生成邏輯的同時,也要注意SAS編程運(yùn)行機(jī)制,避免一些意想不到的錯誤。