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 40766 게시물 읽기
No. 40766
oracle sql 로 각 분단위로 지정시간동안의 누적 합계를 구하려고 하는데 쿼리가 안짜지네요
작성자
버들고양이(xio919)
작성일
2015-04-08 13:50
조회수
6,840

아래처럼 값이 있다고 가정했을때 지정시간을 4분으로 지정했을 경우

2015-04-07 9:20  1
2015-04-07 9:21  1
2015-04-07 9:22  1
2015-04-07 9:23  1
2015-04-07 9:24  1
2015-04-07 9:25  1

이렇게 값이 나오는식으로 쿼리를 짜고 싶습니다.

2015-04-07 9:20  1
2015-04-07 9:21  2
2015-04-07 9:22  3
2015-04-07 9:23  4
2015-04-07 9:24  4
2015-04-07 9:25  4

2015-04-07 9:20은 이전 값이 없으므로 값이 1이 되고
2015-04-07 9:21은 2015-04-07 9:20과 합쳐져서 2
2015-04-07 9:22는 2015-04-07 9:20~9:22까지의 값이 합쳐져서 3이 됩니다.
2015-04-07 9:23에서 9:25까지는 직전 4분간의 값이 존재 하므로 4가 됩니다.
값은 존재하지 않지만 2015-04-07 9:26을 조회하게 되면 9:23~9:26의 값이 합쳐져서 3이 되어야 합니다.

이런식으로 가 분마다 있는 값을 SUM 하는식으로 하여 직전 몇분간의 누적량을 조회하고 싶은데요
쿼리가 안떠오르네요.

임시 테이블을 만들어도 상관없고, 여차하면 Stored Procedure로 하는것도 생각중입니다.

고수님들의 조언 부탁드립니다.
감사합니다~

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

질문사항에 대한 질문이 있습니다.
 9:26 을 언급하셨는데요...
 9:26 이 조회 조건으로 주어지는 값인가요?
 조회 조건으로 주어지는 시간에 대해 4분간의 건수만 출력하면 되는 것인지?
 조회 조건 없이 그냥 저장된 리스트가 쭈욱 뜨면서 옆에 4분간 건수가 출력되어야 하는 것인지?
 아니면 리스트가 뜨면서 없는 정보(9:26)도 리스트에 포함되어 나와야 하는건지요?
 없는 정보도 나와야 한다면? 조회 기간(from~to)이 따로 주어져야 하는게 아닌지?

마농(manon94)님이 2015-04-08 15:22에 작성한 댓글입니다.

설명이 부족했습니다.

검색은 조회기간이 포함되며, 각각의 분에 해당하는 목록이 전부 출력되어야 합니다.

위에 예제로있는 결과는 4/7 9:00 ~ 4/7 9:26 으로 검색했을경우 위와 같이 나올수있습니다.

실제 Data가 존재하는 구간은 9:20~9:25이며 Data가 존재하지 않는 시간은 표시하지 않습니다.

감사합니다.

버들고양이(xio919)님이 2015-04-08 16:03에 작성한 댓글입니다.
이 댓글은 2015-04-08 16:07에 마지막으로 수정되었습니다.

이번에는 컬럼 형식 질문입니다.
해당 항목의 타입이 뭔가요?
 - Date / Varchar2
Varchar2 라면? 시간의 표시가 제시하신대로 '9:26' 형태인가요?
 '09:26' 처럼 고정길이가 아닌 '9:26', '10:21' 처럼 가변길이인 경우 문제가 심각한데요...
 범위 검색시 잘못된 결과가 나올 수 있구요.
 올바른 결과가 나오게 하려면 해당 항목을 가공하여 비교해야 하는데 이러면 인덱스를 못타죠.
Date 또는 고정길이 문자형식이어야 합니다.
가변길이 형식은 바람직하지 않습니다.

마농(manon94)님이 2015-04-08 17:14에 작성한 댓글입니다.

WITH t AS
(
SELECT '2015-04-07 09:20' tm FROM dual
UNION ALL SELECT '2015-04-07 09:21' FROM dual
UNION ALL SELECT '2015-04-07 09:22' FROM dual
UNION ALL SELECT '2015-04-07 09:23' FROM dual
UNION ALL SELECT '2015-04-07 09:24' FROM dual
UNION ALL SELECT '2015-04-07 09:25' FROM dual
)
SELECT tm
     , COUNT(*) OVER(ORDER BY TO_DATE(tm, 'yyyy-mm-dd hh24:mi')
       RANGE INTERVAL '3' MINUTE PRECEDING
       ) AS cnt
  FROM t
 WHERE tm BETWEEN '2015-04-07 09:00' AND '2015-04-07 09:26'
;

마농(manon94)님이 2015-04-08 17:27에 작성한 댓글입니다.

해결했다고 글쓰러 들어왔더니 답이 달려있네요 ㅠㅠ

마농님이 답변 주신것처럼 해결했습니다.

컬럼 형식은 Date구요

감사합니다^^

버들고양이(xio919)님이 2015-04-08 19:51에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40769sql 또 하나 봐주세요. ^^ [2]
이현정
2015-04-10
7359
40768또 하나 질문 드려요. [1]
이현정
2015-04-09
6455
40767sql 좀 봐주세요. [5]
이현정
2015-04-08
7455
40766oracle sql 로 각 분단위로 지정시간동안의 누적 합계를 구하려고 하는데 쿼리가 안짜지네요 [5]
버들고양이
2015-04-08
6840
40765토드와 was의 실행결과가 틀립니다. [1]
조형래
2015-04-07
6485
40764값의 수가 너무 많습니다.라고 에러가 뜨네요~ 알려주세요^^ [4]
짱초보
2015-04-06
7125
40763토,일을 제외한 날짜 카운트 질문 [1]
김영희
2015-04-02
7031
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다