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 40006 게시물 읽기
No. 40006
시간차이 구하는 쿼리 좀 부탁드려요?
작성자
쫑군(rucifer03)
작성일
2013-02-12 18:26
조회수
5,902


안녕하세요.
이리저리 쿼리를 해봐도 결과를 뽑을수가 없어서 이렇게 질문드립니다.


카드번호가 중복인것중 60분내에 결재건을 찾고자 합니다.

아래 결과값에서와 같이 card_no가 중복인것 중 60분내로 결재된것을 뽑아오려고 합니다. 시간옆에는 chai(시간차이값)을 표시해주려고하구여.


쿼리 좀 부탁드려요?

SELECT *
  FROM (SELECT SEQ,
               CARD_NO,
               APPR_TIME,              
               COUNT (*) OVER (PARTITION BY CARD_NO) CARD_NO_CNT
              
          FROM S16

          )
 WHERE 1 < ANY (CARD_NO_CNT)

이렇게 카드중복된 데이타까지는 뽑겠는데 appr_time 부분을 비교해서 60분내것을 뽑을려면 조건을 어떻게 줘야하는지 잘 모르겠습니다.

seq --> 순차적인 번호
card_no --> 카드 번호
appr_time  --> 시.분.초

card_no_cnt -> 카드번호 중복 횟수
cha --> appr_time 의 차이 값


테이블에 들어있는 데이타 샘플:


seq                card_no                appr_time

 4                      1234                    10.49.40
 3                      4323                     07.49.40
 2                      1234                    10.39.40
 1                       5434                   04.49.40


결과값 :

seq                card_no                 appr_time           card_no_cnt             chai

  4                     1234                      10.49.40                   2                            ?
  2                     1234                      10.39.40                   2                            ?

 

 

 

 

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

WITH s16 AS
(
SELECT 4 seq, 1234 card_no, '10.49.40' appr_time FROM dual
UNION ALL SELECT 3, 4323, '07.49.40' FROM dual
UNION ALL SELECT 2, 1234, '10.39.40' FROM dual
UNION ALL SELECT 1, 5434, '04.49.40' FROM dual
-- 같은 카드가 여러번 중복될것을 가정하여 테스트 자료 추가
UNION ALL SELECT 5, 1234, '15.39.40' FROM dual
UNION ALL SELECT 6, 1234, '15.49.40' FROM dual
UNION ALL SELECT 7, 1234, '15.54.40' FROM dual
)
SELECT seq, card_no, appr_time
     , CASE WHEN chai <= 60 THEN chai END chai
  FROM (SELECT seq, card_no, appr_time
             , COUNT(*) OVER(
               PARTITION BY card_no
               ORDER BY TO_DATE(appr_time, 'hh24.mi.ss')
               RANGE BETWEEN INTERVAL '60' MINUTE PRECEDING
                         AND INTERVAL '60' MINUTE FOLLOWING
               ) cnt
             , ( TO_DATE(appr_time, 'hh24.mi.ss')
               - LAG(TO_DATE(appr_time, 'hh24.mi.ss'))
                 OVER(PARTITION BY card_no ORDER BY appr_time)
               ) * 24 * 60 chai
          FROM s16
        )
 WHERE cnt > 1
;

마농(manon94)님이 2013-02-14 14:21에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40009Table 설계시 [1]
아폴론
2013-02-16
5020
40008콤마로된데이타 ,포맷변경가능한가여. [3]
궁금구금
2013-02-14
5186
40007툴에 관한 문의를 드립니다..SQL GATE [3]
새하정
2013-02-14
5508
40006시간차이 구하는 쿼리 좀 부탁드려요? [1]
쫑군
2013-02-12
5902
40005카운트 통계 구하려고 하는데..급하게 하려니 도움요청합니다~ [2]
질문해요
2013-02-12
6534
40004datapump 파일을 다른 폴더에 생성하기
핸시기
2013-02-07
5751
40003테이블 칼럼 값이 2줄일때 1줄로 바꾸는방법 알려주세요 [1]
조윤기
2013-02-07
5706
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다