database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40533 게시물 읽기
No. 40533
표준편차 쿼리 관련 질문
작성자
quest
작성일
2014-07-22 08:57
조회수
9,571

안녕하세요.
표준편차 쿼리 관련해서 질문드립니다.

ROWNUM v1 v2 v3 v4 v5 AVG RANGE 표준편차1 표준편차2
1 3.50 3.80 3.90 3.70 3.70 3.72 0.40 0.1  
2 4.20 3.50 3.60 4.00 3.90 3.84 0.70 0.3  
3 4.20 4.30 4.50 4.10 4.00 4.22 0.50 0.2  
4 3.60 3.80 3.90 3.60 3.70 3.72 0.30 0.1  
5 3.90 3.80 3.70 3.60 3.80 3.76 0.30 0.1  
6 4.50 4.30 3.90 4.50 4.60 4.36 0.70 0.3  
7 4.50 4.40 4.50 4.50 4.50 4.48 0.10 0.0  
8 4.50 4.30 4.60 4.50 4.30 4.44 0.30 0.1  
9 4.30 4.50 4.50 4.50 4.40 4.44 0.20 0.1  
10 3.60 3.80 3.90 3.80 3.50 3.72 0.40 0.2  

위의 경우에서 표준편차1은 각각rownum의 v1에서 v5까지 편차를 구하는것이고,
표준편차2는 rownum1의 v1을 기준으로 rownum 1번의 경우는 v1에서 v5까지 값을 표준편차2에서 셋팅하고,
rownum2의 경우는 rownum 1번의 v1부터 rownum2번의 v5까지의 표준편차 값을 rownum2의 표준편차2를 셋팅하는 식으로,
rownum10은 rownum1의 v1부터 rownum 10의 v5까지의 표준편차를 rownum 10의 표준편차2에 셋팅하는 
쿼리를 구하는것입니다.

답변주시면 감사하겠습니다. 

이 글에 대한 댓글이 총 6건 있습니다.

제시하신 테이블이 원본테이블인가요?
아니면 특정 쿼리의 수행 결과 집합 인가요?
원본이라면 상관이 없지만, 중간집합이라면?
가공된 중간집합을 이용해 재가공하는것이
원본을 바로 가공해 최종결과를 바로 얻는것보다 훨씬 더 어려울 수 있습니다.
중간 결과집합이라면? 차라리 원본집합을 알려주세요.

마농(manon94)님이 2014-07-22 09:53에 작성한 댓글입니다.

안녕하세요.
날짜 조건에 따른 수행 결과의 집합입니다.
즉, 데이타 값은 조회시마다 동적으로 변합니다.
rownum이 하나일수도 있고, n개일수 있습니다.
v1에서 v5는 고정되어 있습니다.

 

quest님이 2014-07-22 10:09에 작성한 댓글입니다.
이 댓글은 2014-07-22 10:12에 마지막으로 수정되었습니다. Edit

v1 ~ v5 이 5개 항목이 원본에 있는 항목인지?

가공(피벗?)해서 만들어낸 항목인지가 궁금한 것입니다.

위 결과를 도출해낸 SQL 을 봤으면 좋겠네요.

마농(manon94)님이 2014-07-22 10:32에 작성한 댓글입니다.
이 댓글은 2014-07-22 10:33에 마지막으로 수정되었습니다.

v1에서부터 v5는 하나의 날짜에 측정치 값이 a라는 컬럼에 시퀀스로 5개가 있다는 의미입니다.
아래의 쿼리를 참조하시면 되고, stdev2값을 구하는겁니다.

SELECT
   rownum,  id, date,cnt_val, m_value,  value1,  value2,  value3,  value4,  value5 , avg, range, stdev1, stdev2
FROM  (
 SELECT   id,
   to_char(com_time_util.from_system_to_local_d('sysAdmin',date),'RRRR-MM-DD') AS date,      
   count(sys_connect_by_path(sequence_id,',')) cnt_val,
   ltrim(max(sys_connect_by_path(m_value,',')), ',')  m_value ,
   rtrim((to_char(avg(nvl(m_value,0)),'FM999990.00')),'.') as avg,
                 rtrim((to_char(max(nvl(m_value,0))-min(nvl(m_value,0)),'FM999990.00')),'.') as range,
                 rtrim((to_char(STDDEV(nvl(m_value,0)),'FM999990.0')),'.') as stdev1,
                 rtrim((to_char(STDDEV(nvl(m_value,0)),'FM999990.0')),'.') as stdev2,                  
   to_char(max(decode(rn,1,m_value)),'FM999990.00') as value1,  to_char(max(decode(rn,2,m_value)),'FM999990.00') as value2,  to_char(max(decode(rn,3,m_value)),'FM999990.00') as value3,  to_char(max(decode(rn,4,m_value)),'FM999990.00') as value4,  to_char(max(decode(rn,5,m_value)),'FM999990.00') as value5
 FROM
    (
    SELECT id,
       date,        
       m_value,
       sequence_id,          
     row_number() over(partition by id,
       date,                                         
       order by sequence_id) rn from
    (
    SELECT aaa.id,
       aaa.date,         
       bbb.m_value,
       bbb.sequence_id          
    FROM aaa aaa, bbb bbb , ccc ccc, ddd ddd, eee eee
    WHERE aaa.id = bbb.id(+)
    AND ccc.id = ddd.id(+)        
)
)
start with rn = 1
connect by prior id=id
AND prior date = date
AND prior rn = rn - 1
GROUP BY id, date
ORDER BY date desc
)
where rownum <= 30 

quest님이 2014-07-22 10:55에 작성한 댓글입니다. Edit

SELECT dr, id, date
     , COUNT(*) cnt_val
     , LISTAGG(m_value) WITHIN GROUP(ORDER BY rn) m_value
     , TO_CHAR(MIN(DECODE(rn, 1, m_value)), 'fm999990.00') value1
     , TO_CHAR(MIN(DECODE(rn, 2, m_value)), 'fm999990.00') value2
     , TO_CHAR(MIN(DECODE(rn, 3, m_value)), 'fm999990.00') value3
     , TO_CHAR(MIN(DECODE(rn, 4, m_value)), 'fm999990.00') value4
     , TO_CHAR(MIN(DECODE(rn, 5, m_value)), 'fm999990.00') value5
     , TO_CHAR(AVG(m_value)               , 'fm999990.00') avg
     , TO_CHAR(MAX(m_value) - MIN(m_value), 'fm999990.0' ) range
     , TO_CHAR(STDDEV(m_value)            , 'fm999990.0' ) stdev1
     , TO_CHAR(stdev2                     , 'fm999990.0' ) stdev2
  FROM (SELECT dr, rn
             , id, date, m_value, sequence_id
             , STDDEV(m_value) OVER(ORDER BY dr) stdev2
          FROM (SELECT id, date, m_value, sequence_id
                     , ROW_NUMBER() OVER(PARTITION BY id, date
                                             ORDER BY sequence_id) rn
                     , DENSE_RANK() OVER(ORDER BY date DESC, id) dr
                  FROM (
                        /* 원본집합 조인쿼리 */
                        )
                )
         WHERE dr <= 30
        )
 GROUP BY dr, id, date, stdev2
 ORDER BY dr
;

마농(manon94)님이 2014-07-22 11:39에 작성한 댓글입니다.

감사합니다.

quest님이 2014-07-22 13:13에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40536쿼리 문의 드립니다. [1]
정기훈
2014-07-23
7521
40535connct by 상위 연결 문제 [1]
마당쇠
2014-07-23
8076
40534중복된 건 조회시 특정조건은 제외하고 한건만 조회하는법 [1]
김승유
2014-07-22
7514
40533표준편차 쿼리 관련 질문 [6]
quest
2014-07-22
9571
40532서버에 win7pro 설치하고 오라클 사용하면...
임철수
2014-07-21
7531
40531그룹 순서별로 묶는것에 대해 문의드립니다. [2]
김태경
2014-07-21
7474
40530오라클 ARCHIVELOG UNTIL TIME 'SYSDATE-10' DELETE INPUT;
김수호
2014-07-20
7626
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다