위치가 연속되는 데이터를 그룹핑 0 4 545

by 어려운문제 [SQL Query] [2019.11.04 08:57:03]


위치가 연속되는 데이터를 그룹핑해서 시작일자와 종료일자를 표시 하려고합니다.
쉽게 될줄알았는데 잘안되네요.

START_DATE            END_DATE            LOC
30-10-2019 06:30    30-10-2019 06:40    이동
30-10-2019 06:40    30-10-2019 06:50    이동
30-10-2019 06:50    30-10-2019 07:00    이동
30-10-2019 07:00    30-10-2019 07:10    Zone9
30-10-2019 07:10    30-10-2019 07:20    이동
30-10-2019 07:20    30-10-2019 07:30    Zone6
30-10-2019 07:30    30-10-2019 07:40    Zone6
30-10-2019 07:40    30-10-2019 07:50    Zone4
30-10-2019 07:50    30-10-2019 08:00    Zone6
30-10-2019 08:00    30-10-2019 08:10    이동
30-10-2019 08:10    30-10-2019 08:20    이동

최종모습 ->

START_DATE            END_DATE            LOC
30-10-2019 06:30    30-10-2019 07:00    이동
30-10-2019 07:00    30-10-2019 07:10    Zone9
30-10-2019 07:10    30-10-2019 07:20    이동
30-10-2019 07:20    30-10-2019 07:40    Zone6
30-10-2019 07:40    30-10-2019 07:50    Zone4
30-10-2019 07:50    30-10-2019 08:00    Zone6
30-10-2019 08:00    30-10-2019 08:20    이동

by 마농 [2019.11.04 09:02:38]

예시 자료엔 종료일시가 시작일시와 항상 연결되는데?
혹시 연속되지 않고 끊기는 자료는 없는지?
항상 연결된다면? 순서만 가지고 쿼리 구현이 가능하지만
끊기는 구간까지 감안해야 한다면? 연속/비연속 체크 로직이 한번 더 들어가야 합니다.
DBMS 및 버전에 따라 구현방법이 달라질 수 있습니다.
DBMS 및 버전 표시해 주세요.


by 어려운문제 [2019.11.04 09:11:08]

답변감사합니다.

일자는 항상 연결되고 환경은 오라클 10 입니다.


by 마농 [2019.11.04 09:23:00]
WITH t AS
(
SELECT '2019-10-30 06:30' start_date, '2019-10-30 06:40' end_date, '이동' loc  FROM dual
UNION ALL SELECT '2019-10-30 06:40', '2019-10-30 06:50', '이동'  FROM dual
UNION ALL SELECT '2019-10-30 06:50', '2019-10-30 07:00', '이동'  FROM dual
UNION ALL SELECT '2019-10-30 07:00', '2019-10-30 07:10', 'Zone9' FROM dual
UNION ALL SELECT '2019-10-30 07:10', '2019-10-30 07:20', '이동'  FROM dual
UNION ALL SELECT '2019-10-30 07:20', '2019-10-30 07:30', 'Zone6' FROM dual
UNION ALL SELECT '2019-10-30 07:30', '2019-10-30 07:40', 'Zone6' FROM dual
UNION ALL SELECT '2019-10-30 07:40', '2019-10-30 07:50', 'Zone4' FROM dual
UNION ALL SELECT '2019-10-30 07:50', '2019-10-30 08:00', 'Zone6' FROM dual
UNION ALL SELECT '2019-10-30 08:00', '2019-10-30 08:10', '이동'  FROM dual
UNION ALL SELECT '2019-10-30 08:10', '2019-10-30 08:20', '이동'  FROM dual
)
SELECT MIN(start_date) start_date
     , MAX(end_date  ) end_date  
     , loc
  FROM (SELECT start_date, end_date, loc
             , ROW_NUMBER() OVER(ORDER BY start_date)
             - ROW_NUMBER() OVER(PARTITION BY loc ORDER BY start_date) gb
          FROM t
        )
 GROUP BY loc, gb
 ORDER BY start_date
;

 


by 어려운문제 [2019.11.04 09:45:30]

답변 정말감사합니다,

ROW_NUMBER() OVER(PARTITION BY loc ORDER BY start_date) <-- 이거만 생각이나서 풀지못햇는데 

저방법은 생각하지도 못했엇네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입