HASH H.CLEAR()的作用

已经用HASH 计算衍生变量好几天了,今天突然觉悟般的领会到hash 里面h.clear的作用。

有这样的一个数据(伪造):几千万条记录,report_id是每个人的唯一标识,每个人贷款多笔,querier是查询机构,query_reason是审批原因,还有等等数据;

需求是:计算每个人贷款审批机构查询次数、信用卡审批查询次数

逻辑:最直接的思路是分组计算 SQL结合DATA步都可以实现,但是数据量比较大时,计算起来就比较慢了,如何使用HASH计算呢

首先建立一个索引

DATA  A (INDEX=(REPORT_ID));

SET A;

RUN;

/*计算*/

DATA B;

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的精华都在这里,这是比较简单的逻辑计算,当然还可以结合时间和其他变量简单快捷的计算很多的衍生变量*/

 

/*完美~*/

posted @ 2017-09-05 10:34  Anni爱摩天轮  阅读(360)  评论(0编辑  收藏  举报