[쿼리 질문]특정값의 특정 조건을 만족하는 데이터 가져오기 0 2 1,350

by 지송요 [SQL Query] [2013.10.30 17:23:08]



with tt as
(
    select 'A' panel_id , 1 flag , to_date('20130101 01:00:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:01:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:01:59','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:02:58','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:05:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:06:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:07:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:08:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:09:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:10:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:11:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 1 flag , to_date('20130101 01:12:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 1 flag , to_date('20130101 01:14:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:15:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:16:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:18:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 3 flag , to_date('20130101 01:00:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 3 flag , to_date('20130101 01:01:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 1 flag , to_date('20130101 01:10:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 1 flag , to_date('20130101 01:13:50','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 3 flag , to_date('20130101 01:14:50','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 3 flag , to_date('20130101 01:15:50','yyyymmdd hh24:mi:ss') time from dual
)
select * from tt


time 컬럼으로 나래비 되 있는 상태에서 flag 값이 1을 기점으로 바로 각 로우의 time과의 차이가 60초 이하인 모든 데이터를 가져오는 방법입니다.
도중 flag 값이 3이면서 60초 이상인 로우가나오면 다음의 flag 값 1을 만나기까지 그냥 무시를 해야됩니다.
결과값은 아래와 같이 나와야 하는데 어떻게 해야 할까요?

with tt as
(
    select 'A' panel_id , 1 flag , to_date('20130101 01:00:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:01:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:01:59','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:02:58','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 1 flag , to_date('20130101 01:12:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 1 flag , to_date('20130101 01:14:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:15:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'A' panel_id , 3 flag , to_date('20130101 01:16:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 1 flag , to_date('20130101 01:10:00','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 1 flag , to_date('20130101 01:13:50','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 3 flag , to_date('20130101 01:14:50','yyyymmdd hh24:mi:ss') time from dual union all
    select 'B' panel_id , 3 flag , to_date('20130101 01:15:50','yyyymmdd hh24:mi:ss') time from dual
)
select * from tt

해결 할 수 있도록 도와주시면 감사하겠습니다.ㅠ

by 마농 [2013.10.30 18:10:09]
SELECT panel_id, flag, time
  FROM (SELECT panel_id, flag, time
             , ROW_NUMBER() OVER(PARTITION BY panel_id ORDER BY time) rn
          FROM tt
        )
 START WITH flag = 1
 CONNECT BY PRIOR panel_id = panel_id
        AND PRIOR rn + 1 = rn
        AND PRIOR time + 1/24/60 >= time
        AND flag = 3
 ORDER BY panel_id, time
;

by 지송요 [2013.11.01 11:40:30]
정신 없이 일하다 보니 감사의 답글 남기는게 늦어졌네요~
마농님 항상 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입