사이트맵  |  Contact Us
 
홈 > SAS Tech & Tip > SAS 고수의 팁
오라클 메타 정보를 활용한 변수 class 별 건수 통계량 산출 2020.02.12
MYSAS_B(백승민) 282 1
http://www.mysas.co.kr/sas_tiptech/a_all.asp?b_no=11280&cmd=content&bd_no=33

오라클 Meta 테이블에서 변수 칼럼(성별) 통계 정보는 제공을 하고 있으나 해당 변수의 Class(남/녀) 통계 정보를 제공을 해주지 않아서 별도로 산출 프로그램 구현. (Class 값이 150개 이하)

 

* 오라클 DB 라이브러리 생성;

libname REAL1 oracle user="DB접속ID" password="DB접속패스워드" path="DB path" ADJUST_BYTE_SEMANTIC_COLUMN_LENGTHS=NO DBCLIENT_MAX_BYTES=1 INSERTBUFF=150000;

 

* 오라클 메타 테이블 ALL_TAB_COLUMNS을 사용하여서 해당 칼람의 class 개수가 150개 이하에 대하여 통계량 산출;

* 컬럼별 class 개수는 "NUM_DISTINCT" 이 값을 사용:

* 통계량 : 개별 컬럼의 class 별 건수;

 

 

* 첫 번째 작업에서는 산출 값에 따라 기준 테이블(target_table)을 생성;

* 이후 반복문에서 INSER INTO작업으로 통계량 적재;

DATA target_table;

     LENGTH TABLE_NAME $128.

            COLUMN_NAME $128.

            COLUMN_ID   $3.

            COL_CLASS   $128.

            CNT         8.;

     STOP;

RUN;

 

* 작업 테이블 지정;

data _null_;

   set REAL1.ALL_TAB_COLUMNS(where=( OWNER = 'APCOM' AND 

                                     TABLE_NAME IN ('CUPT0000TB','CUPT0100TB') AND 

                                     NUM_DISTINCT BETWEEN 0 AND 150)) end=last;

   

   /* if _n_ eq 1 then  */

   call execute('PROC SQL;

                      CREATE TABLE INSERT_DATA AS

                   select '||'"'||TABLE_NAME||'"  AS TABLE_NAME,'

                           ||'"'||COLUMN_NAME||'" AS COLUMN_NAME, '

                           ||'"'||COMPRESS(PUT(COLUMN_ID,$3.))||'"   AS COLUMN_ID,'

                                ||compress(COLUMN_NAME)||'  AS COL_CLASS,

                           COUNT(*) AS CNT 

                   from '||cats('REAL1','.',TABLE_NAME)||' GROUP BY '||COLUMN_NAME||' ;

                 '|| '

 

                 DATA INSERT_DATA_1(RENAME=(COLUMN_ID_1=COLUMN_ID COL_CLASS_1 = COL_CLASS));

                  SET INSERT_DATA;

                      LENGTH COLUMN_ID_1 $3.

                             COL_CLASS_1 $128.;

                      COLUMN_ID_1 = COMPRESS(COLUMN_ID);

                      COL_CLASS_1 = COMPRESS(COL_CLASS);

                      DROP COLUMN_ID COL_CLASS;

                 RUN;

 

                 PROC SQL;

                 insert into target_table

                   select TABLE_NAME,

                          COLUMN_NAME,

                          COLUMN_ID,

                          COL_CLASS,

                          CNT

                   from INSERT_DATA_1 ;

               ');

run;

QUIT;

 

 

* 원본 오라클 메타데이터에 left join;

* 원본 컬럼 정보에 위 산출된 통계량 join;

 

PROC SQL;

  CREATE TABLE WORK.TABLE_STAT AS

    SELECT A.OWNER,

           A.TABLE_NAME,

           A.COLUMN_NAME,

           A.DATA_TYPE,

           A.COLUMN_ID,

           A.NUM_DISTINCT,

           B.COL_CLASS,

           B.CNT

    FROM   REAL1.ALL_TAB_COLUMNS A

           LEFT JOIN target_table B

                ON   A.TABLE_NAME  = B.TABLE_NAME

                AND  A.COLUMN_NAME = B.COLUMN_NAME

    where  A.OWNER = 'APCOM' 

      AND  A.TABLE_NAME IN ('CUPT0000TB','CUPT0100TB')  /* 테이블 명*/

    ORDER BY 

           A.TABLE_NAME,

           A.COLUMN_ID,

           B.COL_CLASS;

QUIT; 

 

* 출처 : 기서무나구물 (http://statwith.com/sas-tip-%ec%98%a4%eb%9d%bc%ed%81%b4-%eb%a9%94%ed%83%80-%ec%a0%95%eb%b3%b4%eb%a5%bc-%ed%99%9c%ec%9a%a9%ed%95%9c-%eb%b3%80%ec%88%98-class-%eb%b3%84-%ea%b1%b4%ec%88%98-%ed%86%b5%ea%b3%84%eb%9f%89/)

 
 
휴대폰 번호
휴대폰 인증번호
 
 [통계]Deep Learning_신경망03
 [통계]Deep Learning_신경망02