HASH H.CLEAR()的做用

已经用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的精华都在这里,这是比较简单的逻辑计算,固然还能够结合时间和其余变量简单快捷的计算不少的衍生变量*/

 

/*完美~*/

相关文章
相关标签/搜索