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的精華都在這裏,這是比較簡單的邏輯計算,固然還能夠結合時間和其餘變量簡單快捷的計算不少的衍生變量*/

 

/*完美~*/

相關文章
相關標籤/搜索