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

    /*完美~*/

  • 相关阅读:
    Cocos2d-x 3.2:定时器的使用和原理探究(2)
    Cocos2d-x 3.2:定时器的使用和原理探究(1)
    c++初学(电梯实验加强版)
    中序线索化二叉树
    c++初学(电梯实验)
    二叉树表达式计算(2)
    输入计算表达式,将他们存在string【】中
    函数修改二维数组的值
    单件模式以及内存释放
    迷宫(栈)不能求最短路径
  • 原文地址:https://www.cnblogs.com/Anni-love-Ferris-wheel/p/7477368.html
Copyright © 2011-2022 走看看