BookmarkSubscribeRSS Feed

[HASH Object] HASH 테이블에서 동일한 키 값을 가지는 다중 항목 검색하기

Started ‎06-12-2020 by
Modified ‎06-12-2020 by
Views 57

* HASH 테이블에서 동일한 키 값을 가지는 다중 항목 검색하기;

 

  * 원문 : Sample 24641: Find multiple items in a hash table that have the same key;

 

  * 사이트 : http://support.sas.com/kb/24/641.html;

 

********************************************************************;

/* METHOD 1                                                        */

********************************************************************;

/* 첫 번째 Method는 hash 반복기(iterator)를 사용하여서 첫 번째 키 값이 동일한(두 번째 키 값은 체크 안 함) 모든 항목을 hash object에서 검색한다. 

   반복기 오브젝트를 사용하여서 전체 hash 테이블을 처리.;

   이 Method는 중복 키값을 허용하지 않은 SAS 9.1 버젼에서 처리하는 방식(SAS 9.2 이상에서는 중복 키값 처리 가능). 

   원하는 키 값을 검색하기 위하여 반복기(iterator) 오브젝트를 사용하여서 전체 hash 테이블을 읽어야 한다.*/

 

data work.sales;

  input prod $1-5 size qty $10-15;

datalines;

tie   10 39007

tie   11 398487

shirt 20 384223

pants 30 329559

pants 31 329559

;

 

data tie1;

     /* DATA 스텝의 첫 번째 반복 작업을 수행하면서, HASH object H를 선언하고, WORK.SALES 데이터를 로드한다. 

        ORDERED: 인수 태그는 데이터 값이 내림차순으로 정렬하여 로드되도록 처리한다.

 

        hash table에서 중복 키값을 허용하지 않기 때문에, PROD와 SIZE 양쪽 변수를 키 값 변수로 정의한다.

        기본적으로 키 변수는 출력되지 않기 때문에, 키 값을 출력하기 위하여 QTY 변수와 함께 defineData에 정의한다.

 

        로그에 "변수 'prod'이(가) 초기화되지 않았습니다." 메시지 출력을 방지하기 위하여,

        데이터 세트 변수 prod, qty 와 size 변수를 결측치 값으로 초기화

     */

 

     if _N_ = 1 then do;

       length prod $10 qty $6 size 8;

       declare hash h(dataset: 'work.sales', ordered: 'yes');

       declare hiter iter('h'); * HASH 반복기 ITER 선언;

 

       /* Define key and data variables */

       h.defineKey('prod', 'size');

       h.defineData('qty','prod','size');

       h.defineDone();

       call missing(prod,qty,size);

     end;

 

     /* 현재 첫 번째 키 값을 기준으로 처리하기 원하기 때문에, Hash 오브젝트를 반복하여 처리하는 반복기(iterator)를 사용하여서 

        첫 번째 키 값이 PROD='tie'인 모든 데이터 값을 출력한다. */

     rc = iter.first();

     do while (rc = 0);

       if prod='tie' then output;

       rc = iter.next();

     end;

run;

 

proc print;

run;

 

 

 

********************************************************************;

/* METHOD 2                                                        */

********************************************************************;

 

/* 두 번째 Method는 원하는 키 값을 검색하기 위하여 SAS 9.2에서 제공하는 새로운 방식으로 키 값에 대하여 중복 데이터 항목을 처리할 수 있다.

   이 방식은 hash 검색기(iterator) object 대신에 사용자가 지정한 키 값과 일치하는 행만을 처리할 수 있다. */

 

data work.sales;

  input prod $1-5 size qty $10-15;

datalines;

tie   10 39007

tie   11 398487

shirt 20 384223

pants 30 329559

pants 31 329559

;

 

data tie2;

     /* DATA 스텝의 첫 번째 반복 작업을 수행하면서, HASH object H를 선언하고, WORK.SALES 데이터를 로드한다. 

        ORDERED: 인수 태그는 데이터 값이 내림차순으로 정렬하여 로드되도록 처리한다. HASH 반복기 ITER를 선언한다.

         multidata: 인수 태그를 지정하여서 hash 테이블에서 중복 키값을 사용할 수 있으므로 PROD 변수만을 키 변수로 정의한다.

         기본적으로 키 변수는 출력되지 않기 때문에, 키 값을 출력하기 위하여 QTY 변수와 함께 키 변수를 defineData에 정의한다. */

     if _N_ = 1 then do;

        if 0 then set work.sales;

        declare hash h(dataset: 'work.sales', ordered: 'yes', multidata:'Y');

 

        /* 키 값과 출력 변수를 지정 */

        /* multidata 인수 태그를 지정하였기 때문에 하나의 키(prod)만을 지정한다 */

        h.defineKey('prod' );

        h.defineData('prod','size','qty');

        h.defineDone();

     end;

 

     /* FIND() method는 키 값에 해당하는 값을 검색한다.

        has_next 매소드를 사용하여서 키 값을 기준으로 여러 데이터 값이 존재하는지 확인할 수 있다. */

 

     rc = h.find(key:'tie');

     if rc = 0 then do;

        output;

        rc2 = h.has_next(RESULT:R);

        do while (R ne 0);

           rc = h.find_next();

           output;

           rc2 = h.has_next(RESULT:R);

        end;

     end;

     keep prod size qty;

run;

 

proc print;

run;

 

 

***********************************************************
- 통계분석연구회 
- 카페 : http://cafe.daum.net/statsas
- 통계분석연구회 페이지 : https://www.facebook.com/statsas 

- 통계분석연구회(Statistics Analysis Study) 그룹 :https://www.facebook.com/groups/statsas/ 

Version history
Last update:
‎06-12-2020 05:17 AM
Updated by:
Contributors

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

Article Labels
Article Tags