今天了解到一個(gè)計(jì)算CHG的超便捷方法,應(yīng)該可以一下把base,chg都列出來(lái)。
相比以前的做法,不知道大家是不是先排序,然后用retain把base的值保留下來(lái),然后再用aval-base;這樣可能需要好幾個(gè)過(guò)程步,步驟比較繁瑣,但是用今天的方法---hash object一個(gè)過(guò)程步就能解決。
原數(shù)據(jù):
接著用hash對(duì)象得到base和計(jì)算CHG。
就這么一段程序就得出結(jié)果,是不是不可思議?
接下來(lái)解釋一下程序:
1:在上面的程序中,我們創(chuàng)建了一個(gè)hash table叫baset(注意不能和我們的ADaM變量base重名,否則會(huì)報(bào)錯(cuò))。
2:在DATA步中,HASH對(duì)象應(yīng)該只聲明一次。我們?cè)赺n_=1的時(shí)候申明;之后我們聲明了HASH對(duì)象并在一個(gè)步驟中加載數(shù)據(jù),在這里你可以用上data步常見(jiàn)的語(yǔ)句。注意我們用上了rename選項(xiàng),這樣當(dāng)我們從hash table中檢索一條記錄時(shí),就不會(huì)覆蓋PDV中的aval的值。
3:這個(gè)hash table有兩個(gè)關(guān)鍵的keys:
??? baset.definekey('paramcd','usubjid');這樣應(yīng)該就相當(dāng)于把原數(shù)據(jù)根據(jù)usubjid,paramcd分類(lèi)了。當(dāng)然你還可以根據(jù)需求加上param甚至avisitn.
????還有一個(gè)data value
baset.definedata('base');每次我們?cè)趆ash table中查找parameter和subject時(shí)(注意,這里應(yīng)該不是指paramcd和usubjid,應(yīng)該是hash table中特有的關(guān)鍵詞),我們都會(huì)得到返回的基線(xiàn)值。
4:base.find()?會(huì)使用PDV中paramcd和usubjid的當(dāng)前值來(lái)搜索hash table。在查找之后,我們檢查是否找到了鍵值(即rc=0),注意,計(jì)算機(jī)語(yǔ)言中0代表假,1代表真,但是在hash table中rc=0才代表檢索成功。
5:如果在hash table中找到主題(subject)/參數(shù)(parameter),PDV中基線(xiàn)的當(dāng)前值將被覆蓋,然后我們就可以計(jì)算chg=(aval-base)。如果沒(méi)有找到主題/參數(shù),PDV中的基線(xiàn)值將不會(huì)更改,它將擁有最后一次成功查找的值。
注意一定要加上rc= baset.find(); if rc=0? then XXXX,否則計(jì)算出的值可能不正確。
當(dāng)然了,你也可以在if rc=0? then XXXX這句話(huà)加上多個(gè)判斷條件,比如:
if rc=0? and?avisitn^=1?then chg=(aval-base);篩選期不計(jì)算CHG。
是不是又get了一個(gè)新技能?
快扛不住了,連著工作14天,晚上有時(shí)候還得搞項(xiàng)目,有點(diǎn)997的那個(gè)意思了,好在還可以保證足夠的睡眠。如果感到困,那還是自己非要刷一下手機(jī)才睡覺(jué)。這就叫做自作孽不可活