• SAS HASH 如何使用不唯一的key


    HASH的正常使用是要求唯一的key,但如果想使用相同关键值key,参考
    https://wenku.baidu.com/view/2cc9b821a1c7aa00b42acba0.html

    举例如下(应用:多对多的表关联):

    data testdup(index=(key));
    length key data 8;
    input key data;
    datalines;
    1 10
    2 11
    1 15
    3 20
    2 16
    2 9
    3 100
    5 5
    1 5
    4 6
    5 99
    ;
    run;
    data a;
    input key data1;
    cards;
    1 8
    1 11
    2 14
    2 3
    5 6
    5 8
    ;
    run;

    data RESULT(KEEP=KEY DATA temp RESULT );
    length r 8;
    IF _N_=0 THEN SET A;
    IF _N_=1 THEN DO;
    dcl hash h(dataset:'A', multidata: 'y', ordered: 'y');/*multidata:'y'允许重复的KEY在hash中出现,默认情况不允许*/
    h.definekey('key');
    h.definedata('key', 'data1');
    h.definedone();
    call missing (key, data1);
    END;
    SET testdup;
    by key;
    result=0;

    rc = h.find();
    if (rc = 0) then do;
    if data>data1 then DO;result=1;TEMP=DATA1;ouput;END;
    put key= data= data1= result=;
    h.has_next(result: r);/*h.has_next():在允许出现相同关键词的前提下,判断是否存在下一条相同关键字的观测*/
    do while(r ne 0);/*不等于0表示存在下一条相同关键字的观测*/
    rc = h.find_next();/*h.find_next():在允许出现相同关键字的前提下,寻找下一条相同关键字的观测*/
    if data>data1 then DO;result=1;TEMP=DATA1; output;END;
    put 'dup ' key= data= data1= result=;
    rc = h.replacedup();/*h.replacedup():在允许出现相同关键词的前提下,使用新的数据代替当前关键字对应的数据等*/
    h.has_next(result: r);
    end;
    end;

    run;
    PROC PRINT DATA=RESULT;
    RUN;

    结果如下:

    ObskeydataresultTEMP
    1 1 10 1 8
    2 1 15 1 8
    3 1 15 1 11
    4 2 11 1 3
    5 2 16 1 14
    6 2 16 1 3
    7 2 9 1 3
    8 5 99 1 6
    9 5 99 1 8
  • 相关阅读:
    WINDOWS 远程桌面不能直接拷贝文件问题
    Spring的xml文件详解
    xml名称空间详解
    markdown基本语法
    web.xml文件详解
    Spring事务的7中传播行为
    docker修改容器配置文件
    Load balancer does not have available server for client: CLOUD-PROVIDER-HYSTRIX-PAYMENT
    layui导出表格的两种方法
    解决:Error:java: 无效的源发行版: 12
  • 原文地址:https://www.cnblogs.com/Anni-love-Ferris-wheel/p/7552005.html
Copyright © 2020-2023  润新知