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 21063 게시물 읽기
No. 21063
group by 절을 쓰면서 통계를 출력
작성자
정진종
작성일
2004-12-15 10:51
조회수
4,057

데이터가 다음과 같이 있고요...

mytable

time value

2004-12-12 12:30:12 3

2004-12-12 12:30:12 4

2004-12-12 12:30:12 5

2004-12-12 12:30:12 6

2004-12-12 12:30:12 7

2004-10-10 10:10:10 3

2004-10-10 10:10:10 4

2004-10-10 10:10:10 5

2004-10-10 10:10:10 6

2004-10-10 10:10:10 7

........................................................

 

대충 위와 같이 데이터가 있습니다 .

 

select time, sum(value) from mytable groupby time;

 

select time, avg(sum(value)), mix(sum(value)), max(sum(value)),

from mytable groupby time;

 

이렇게 두번 질의 던져서 결과를 가져오고 있습니다. (처음것을 시간별로 합계, 두번째는 시간별로 합계에 대한 통계)

현재는 데이터거 너무 많아서 시간이 걸리는데...

시간을 단축 시키고자 이것을 한번에 실행 시킬수 있는 방법이 없나요?

 

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

이상하게 쿼리를 날리시내요?

select time, sum(value),avg(value), mix(value), max(value),

from mytable groupby time;

이렇게 한방에 날릴수 있습니다.

 

원하는 값이 이게 아니신지? 표준편차도 가능한걸로아는데

STD 함수가 있던가? STDDEV 던가?

장종훈(우연을가장한인연)님이 2004-12-15 11:07에 작성한 댓글입니다.

자세히 보시면...

avg(value), mix(value), max(value)

 

이것이 아니라...

 

avg(sum(value)), mix(sum(value)), max(sum(value))

 

이것 입니다...합들의 평균, 합들의 최소, 합들의 최대를

 

구하는거죠....음...잘 안되네요.음...

정진종님이 2004-12-15 14:58에 작성한 댓글입니다. Edit

시간에 대한 합계와..합계에 대한 통계가 같이 나와야 한다는 말씀이시죠?

 

이런식으로...

time                           value

2004-12-12 12:30:12     SUM(VALUE)

2004-10-10 10:10:10     SUM(VALUE)

AVG                            AVG(VALUE)

MIN                             MIN(VALUE)

MAX                            MAX(VALUE)

 

기존의 방식은..

SUM를 구할때 mytable을 한번 scan하고..

avg, min, max를 구할때 또 한번 mytable을 scan하니..

불필요하게 한번 더 엑세스가 되어 시간이 올래 걸리는게 문제다..

라고 이해하고..

쿼리를 한번 만들어봤습니다.

우선..

 

SELECT DECODE(B.NO, 2, 'GROUP', TIME) AS TIME,
            AVG(VALUE) AS AVG,
            MIN(VALUE) AS MIN,
            MAX(VALUE) AS MAX
FROM   (SELECT TIME,
                          SUM(VALUE) AS VALUE
              FROM   MYTABLE
             WHERE  BILL_DT LIKE '200412%'
             GROUP  BY TIME
            )A,
            COPY_T B
WHERE  B.NO < 3
GROUP  BY DECODE(B.NO, 2, 'GROUP', TIME)

 

COPY_T테이블은...

NO   NO2

1      01

2      02

3      03

4      04

5      05

.       .

.       .

이런식의 값이 저장되어있는... 테이블 복사용 테이블입니다..

위처럼 쿼리를 날리면...

쿼리가 간단하긴 한데.. 결과값모양이 쪼메 이상합니다..

요론식으로...

 

TIME                         AVG                MIN                MAX

2004-12-12 12:30:12   SUM(VALUE)   SUM(VALUE)   SUM(VALUE)

2004-10-10 10:10:10   SUM(VALUE)   SUM(VALUE)   SUM(VALUE)

GROUP                     AVG()              MIN()              MAX()

붉은 색으로 표시된 불필요한 데이터가 나오겠죠..

쿼리 결과를 받아서 적당히 가공후 화면에 뿌려주는 경우라면..

관계없겠지만..결과를 바로 사용해야만 하는 상황이라면..

안되겠죠..

 

그래서..

다음쿼리는..

SELECT TIME,
             DECODE(TIME, 'AVG', AVG(VALUE),
                                    'MAX', MAX(VALUE),
                                    'MIN', MIN(VALUE),
                                     MAX(VALUE)) AS VALUE

FROM   (SELECT DECODE(B.NO, 2, 'AVG', 
                                                 3, 'MAX', 
                                                 4, 'MIN', 
                                                 TIME) AS TIME,
                          VALUE
              FROM   (SELECT TIME,
                                        SUM(VALUE) AS VALUE
                            FROM   MYTABLE
                           GROUP  BY TIME
                          )A,
                          COPY_T B
             WHERE  B.NO < 5
             )
GROUP  BY TIME

위의 쿼리 결고는...이런식으로 나오겠죠..

time                            value

2004-12-12 12:30:12     SUM(VALUE)

2004-10-10 10:10:10     SUM(VALUE)

AVG                            AVG(VALUE)

MAX                            MAX(VALUE)

MIN                             MIN(VALUE)

 

쿼리가 좀 길어지고..조금더 늦어졌을지도 모르지만..

원하는 결과쪽으로 나올 것입니다.

시간 차이는 그리 크게 나지 않을껍니다.

 

기존 쿼리를 두번 날렸던 경우 보다 수행속도는 약 2배정도 빨라질겁니다..

아마도요..@.@

 

시간이 남아서 주저리 주저리 말이 길었습니다. (__

 

작살초보(작살초보)님이 2004-12-15 15:11에 작성한 댓글입니다.
이 댓글은 2004-12-15 16:33에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
21066그룹 합계에 관하여 질문드립니다. [4]
이진홍
2004-12-15
2075
21065테이블 스페이스 크기 조정 [1]
초보
2004-12-15
1357
21064[질문]디스크 I/O 튜닝에 대해... [4]
김선구
2004-12-15
2469
21063group by 절을 쓰면서 통계를 출력 [3]
정진종
2004-12-15
4057
21061오라클 04031 에러 질문이요.. [3]
로그파일
2004-12-14
1881
21060[질문]시작일과 끝날자를 입력 받는 쿼리 [2]
신승익
2004-12-14
1341
21059Table Schema Size를 구하는 SQL 은 없는지요? [4]
mini
2004-12-14
3576
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다