안녕하세요~ 공분산 매트릭스를 만들다가 포기하고 질문올립니다. 1 10 1,631

by 완전초짜 [SQL Query] [2012.10.31 13:48:08]



오라클 버전은 9i이구요

현재 col1,col2,col3,col4,col5,col6,col7,col8,col9,col10,col11,col12,col13,col14,col15의 컬럼이 존재합니다.
데이터를 긁어 오고싶은데.. 보안때문에 복사,캡쳐가 안되네요..
하나의 col에는 60개의 데이터가 존재합니다.
총 데이터는 900개입니다.
테이블 명은 covar_mx라고 가정하였을때

select covar(col1,col1)
from   covar_mx
하면 공분산이 나옴니다.

제가 궁금한것은 데이터가 이런 형식으로 나왔으면 하는데요 안에 숫자는 covar(col,col)을 의미합니다.
(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10),(1,11),(1,12),(1,13),(1,14),(1,15)
(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(2,10),(2,11),(2,12),(2,13),(2,14),(2,15)
(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(3,10),(3,11),(3,12),(3,13),(3,14),(3,15)
(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(4,10),(4,11),(4,12),(4,13),(4,14),(4,15)
(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(5,10),(5,11),(5,12),(5,13),(5,14),(5,15)
(6,1),(6,2),(6,3),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(6,10),(6,11),(6,12),(6,13),(6,14),(6,15)
(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(7,10),(7,11),(7,12),(7,13),(7,14),(7,15)
(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(8,10),(8,11),(8,12),(8,13),(8,14),(8,15)
(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9),(9,10),(9,11),(9,12),(9,13),(9,14),(9,15)
(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9),(10,10),(10,11),(10,12),(10,13),(10,14),(10,15)
(11,1),(11,2),(11,3),(11,4),(11,5),(11,6),(11,7),(11,8),(11,9),(11,10),(11,11),(11,12),(11,13),(11,14),(11,15)
(12,1),(12,2),(12,3),(12,4),(12,5),(12,6),(12,7),(12,8),(12,9),(12,10),(12,11),(12,12),(12,13),(12,14),(12,15)
(13,1),(13,2),(13,3),(13,4),(13,5),(13,6),(13,7),(13,8),(13,9),(13,10),(13,11),(13,12),(13,13),(13,14),(13,15)
(14,1),(14,2),(14,3),(14,4),(14,5),(14,6),(14,7),(14,8),(14,9),(14,10),(14,11),(14,12),(14,13),(14,14),(14,15)
(15,1),(15,2),(15,3),(15,4),(15,5),(15,6),(15,7),(15,8),(15,9),(15,10),(15,11),(15,12),(15,13),(15,14),(15,15)
이렇게 데이터를 추출하고 싶은데요.... union all 말고 바로 조회할수있을까요?
by 아발란체 [2012.10.31 14:43:34]
 
--1.
--일단 항목이 15개이고, 총 60건이 되도록 데이타셋을 만들었습니다.
WITH COVAR_MX AS (
  SELECT
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL1,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL2,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL3,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL4,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL5,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL6,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL7,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL8,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL9,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL10,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL11,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL12,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL13,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL14,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL15
  FROM 
    DUAL
  CONNECT BY
    ROWNUM <= 60
)
SELECT * FROM COVAR_MX

by 완전초짜 [2012.10.31 14:54:05]

감사합니다~ with문을 어찌 하드코딩해서 적어드리나 고민하다가 저렇게 설명했었는데요.. ㅜ.ㅜ

by 아발란체 [2012.10.31 14:58:31]
--위처럼 데이타가 있을 때 다음과 같이 조회
SELECT
 DECODE(MOD(CEIL(ROWNUM / 15) - 1, 15) + 1,
   1, COL1,
   2, COL2,
   3, COL3,
   4, COL4,
   5, COL5,
   6, COL6,
   7, COL7,
   8, COL8,
   9, COL9,
  10, COL10,
  11, COL11,
  12, COL12,
  13, COL13,
  14, COL14,
  15, COL15
 ) AS X,
 DECODE(MOD(ROWNUM - 1, 15) + 1,
   1, COL1,
   2, COL2,
   3, COL3,
   4, COL4,
   5, COL5,
   6, COL6,
   7, COL7,
   8, COL8,
   9, COL9,
  10, COL10,
  11, COL11,
  12, COL12,
  13, COL13,
  14, COL14,
  15, COL15
 ) AS Y
FROM --225건 * 60건 = 13,500건(1행당 1,1 ~ 15,15까지 225번 수행, 225번 * 60행 = 13,500건) 
 COVAR_MX, --60건 
 (SELECT LEVEL AS lv FROM DUAL CONNECT BY ROWNUM <= (15 * 15)) -- (1, 1) ~ (1, 15) 1행(15개) * 15행 방법으로 일단 15*15 개수 데이타 만들기 / 225건 

by 아발란체 [2012.10.31 15:01:06]
--검증 방법
--(1,1 ~ 15,15) * 60행 제대로 탐색 했는지 랜덤값과 목적값 다 출력
WITH COVAR_MX AS (
  SELECT
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL1,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL2,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL3,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL4,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL5,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL6,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL7,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL8,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL9,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL10,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL11,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL12,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL13,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL14,
    ROUND(DBMS_RANDOM.VALUE(1, 10)) COL15
  FROM 
    DUAL
  CONNECT BY
    ROWNUM <= 60
)
SELECT
  ROWNUM AS "실행순서",
  LV AS "1행당 탐색순서",
  MOD(CEIL(ROWNUM / 15) - 1, 15) + 1 AS X_POS,
  MOD(ROWNUM - 1, 15) + 1 AS Y_POS,
  COVAR_MX.*,
  DECODE(MOD(CEIL(ROWNUM / 15) - 1, 15) + 1,
     1, COL1,
     2, COL2,
     3, COL3,
     4, COL4,
     5, COL5,
     6, COL6,
     7, COL7,
     8, COL8,
     9, COL9,
    10, COL10,
    11, COL11,
    12, COL12,
    13, COL13,
    14, COL14,
    15, COL15
  ) AS "목적X값",
  DECODE(MOD(ROWNUM - 1, 15) + 1,
     1, COL1,
     2, COL2,
     3, COL3,
     4, COL4,
     5, COL5,
     6, COL6,
     7, COL7,
     8, COL8,
     9, COL9,
    10, COL10,
    11, COL11,
    12, COL12,
    13, COL13,
    14, COL14,
    15, COL15
  ) AS "목적Y값"
FROM --225건 * 60건 = 13,500건(1행당 1,1 ~ 15,15까지 225번 수행, 225번 * 60행 = 13,500건) 
  COVAR_MX, --60건 
  (SELECT LEVEL AS lv FROM DUAL CONNECT BY ROWNUM <= (15 * 15)) -- (1, 1) ~ (1, 15) 1행(15개) * 15행 방법으로 일단 15*15 개수 데이타 만들기 / 225건 

by 완전초짜 [2012.10.31 16:42:33]

질문답변에 감사합니다~~ ^^
데이터를 뿔려서 컬럼을 정해주면 되는군요... 속도는 많이 느려지겠네요.. ㅜ.ㅜ


by 완전초짜 [2012.10.31 16:53:13]

ㅜ.ㅜ 적용을하다 보니깐.. 데이터를 뿔려도 covar_pop함수는 그 row전체 에 대하여 계산이 되어서... 적용이 안되네요.. ㅜ.ㅜ

by 아발란체 [2012.10.31 17:02:36]

제일 좋은 것은 상황을 자세히 써주시면 보다 정확하고 효율적인 답을 드릴 수 있을 것 같아요.

테이블 구조와 사용 하고 있는 함수 내용과 샘플 데이타가 있고,
결과는 어떻게 보여줘야 하는지 예시를 주시면 보다 좋은 결과를 얻으실 수 있을거라 생각하네용~ 


by 완전초짜 [2012.10.31 17:20:12]

ㅜ.ㅜ 문서보안때문에 서술로만 쓰다보니깐.. 많이 부족하세요...

covar_pop(col1,col2) => col1,col2의 공분산을 구하는 함수,리턴값은 1개로 나옴니다.

예를 들어 COL1에 60개 COL2에 60개의 데이터가 있을경우 위에 함수를 적용하면 1개의 값으로 자동 계산되어 나옴니다..

이것을 매트릭스로 만들고 싶은데요... 설명이 어렵네요.. ㅜ.ㅜ

by 완전초짜 [2012.10.31 17:31:23]

아발란체님~~ ㅜ.ㅜ 제가 생각을 잘못했네요... 도와주신방법 비슷하게 해결했습니다~ 감사합니다~~^^

by 아발란체 [2012.10.31 18:23:32]
다행이네용. ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입