BookmarkSubscribeRSS Feed

오라클 메타 정보를 활용한 변수 class 별 건수 통계량 산출

Started ‎06-15-2020 by
Modified ‎06-15-2020 by
Views 260

오라클 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%...)

Version history
Last update:
‎06-15-2020 04:46 AM
Updated by:
Contributors

hackathon24-white-horiz.png

The 2025 SAS Hackathon Kicks Off on June 11!

Watch the live Hackathon Kickoff to get all the essential information about the SAS Hackathon—including how to join, how to participate, and expert tips for success.

YouTube LinkedIn

Article Labels
Article Tags