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