已经用HASH 计算衍生变量好几天了,今天忽然觉悟般的领会到hash 里面h.clear的做用。3d
有这样的一个数据(伪造):几千万条记录,report_id是每一个人的惟一标识,每一个人贷款多笔,querier是查询机构,query_reason是审批缘由,还有等等数据;blog
需求是:计算每一个人贷款审批机构查询次数、信用卡审批查询次数索引
逻辑:最直接的思路是分组计算 SQL结合DATA步均可以实现,可是数据量比较大时,计算起来就比较慢了,如何使用HASH计算呢hash
首先创建一个索引变量
DATA A (INDEX=(REPORT_ID));遍历
SET A;im
RUN;数据
/*计算*/查询
DATA B;img
SET A;
BY REPORT_ID;/*对应前面创建的索引*/
/*初始化hash*/
IF _N_=1 THEN DO;
DCL HASH H_Q(ORDERED:'YES');
DCL HITER HI_Q('H_Q');
H_Q.DEFINEKEY('QUERIER');/*以查询机构为key*/
H_Q.DEFINEDATA('LN','LND');
H_Q.DEFINEDONE();
CALL MISSING(LN,LND);
END;
/*对每一个report_id计算每种机构的个数*/
IF H_Q.FIND() ^=0 THEN DO;
LN=0;
LND=0;
IF QUERY_REASON='贷款审批' THEN LN+1;
IF QUERY_REASON='信用卡审批' THEN LN+1;
H_Q.ADD();
END;
ELSE IF H_Q.FIND() =0 THEN DO;
IF QUERY_REASON='贷款审批' THEN LN+1;
IF QUERY_REASON='信用卡审批' THEN LN+1;
H_Q.REPLACE();
END;
/*取遍历的每一个report_id的最后一条观测*/
IF LAST.REPORT_ID THEN DO;
LN_T=0;
LND_T=0;
/*遍历*/
RC=HI_Q.FIRST();
DO WHILE(RC=0);
IF LN>0 THEN LN_T+1;
IF LND>0 THEN LND_T+1;
RC=HI_Q.NEXT();
END;
H_Q.CLEAR();/*强调一下这里H_Q.CLEAR()的做用:*/
OUTPUT;
END;
/*强调一下这里H_Q.CLEAR()的做用:若是没有的话,计算出来的LN_T、LND_T是对不一样的report_id累加的结果*/
/*理解的HASH的精华都在这里,这是比较简单的逻辑计算,固然还能够结合时间和其余变量简单快捷的计算不少的衍生变量*/
/*完美~*/