今天了解到一个计算CHG的超便捷方法,应该可以一下把base,chg都列出来。
相比以前的做法,不知道大家是不是先排序,然后用retain把base的值保留下来,然后再用aval-base;这样可能需要好几个过程步,步骤比较繁琐,但是用今天的方法---hash object一个过程步就能解决。
原数据:
接着用hash对象得到base和计算CHG。
就这么一段程序就得出结果,是不是不可思议?
接下来解释一下程序:
1:在上面的程序中,我们创建了一个hash table叫baset(注意不能和我们的ADaM变量base重名,否则会报错)。
2:在DATA步中,HASH对象应该只声明一次。我们在_n_=1的时候申明;之后我们声明了HASH对象并在一个步骤中加载数据,在这里你可以用上data步常见的语句。注意我们用上了rename选项,这样当我们从hash table中检索一条记录时,就不会覆盖PDV中的aval的值。
3:这个hash table有两个关键的keys:
baset.definekey('paramcd','usubjid');这样应该就相当于把原数据根据usubjid,paramcd分类了。当然你还可以根据需求加上param甚至avisitn.
还有一个data value
baset.definedata('base');每次我们在hash table中查找parameter和subject时(注意,这里应该不是指paramcd和usubjid,应该是hash table中特有的关键词),我们都会得到返回的基线值。
4:base.find() 会使用PDV中paramcd和usubjid的当前值来搜索hash table。在查找之后,我们检查是否找到了键值(即rc=0),注意,计算机语言中0代表假,1代表真,但是在hash table中rc=0才代表检索成功。
5:如果在hash table中找到主题(subject)/参数(parameter),PDV中基线的当前值将被覆盖,然后我们就可以计算chg=(aval-base)。如果没有找到主题/参数,PDV中的基线值将不会更改,它将拥有最后一次成功查找的值。
注意一定要加上rc= baset.find(); if rc=0 then XXXX,否则计算出的值可能不正确。
当然了,你也可以在if rc=0 then XXXX这句话加上多个判断条件,比如:
if rc=0 and avisitn^=1 then chg=(aval-base);筛选期不计算CHG。
是不是又get了一个新技能?
快扛不住了,连着工作14天,晚上有时候还得搞项目,有点997的那个意思了,好在还可以保证足够的睡眠。如果感到困,那还是自己非要刷一下手机才睡觉。这就叫做自作孽不可活