※ 필수 조건 : 병원명 / 진료과목 / 환자명은 다양하게 발생함
※ 병원명/진료과목/환자명이 연속으로 동일한 경우 여러번의 진료시간(Data불규칙)을 모아서 시작 - 끝 시간을 하나로 묶는다.
단, 병원명/진료과목/환자명이 동일하지만 비연속인 경우, 진료횟수가 다르다고 판단되어 개별반영한다.
※ 환자명=다음환자명 이면, 해당 Data를 제거하고,
환자명<>다음행의 환자명이면 해당 진료시간을 진료예정시간으로 가져와야한다. (Partition By 병원명 / 진료과목 必)
--QUERY
SELECT 병원명, 진료과목, 환자명, 진료시간, 이전진료시간, 다음환자명, 진료예정시간 FROM (SELECT 병원명, 환자명, 진료과목, 진료시간, LAG(환자명) OVER(PARTITION BY 진료과목 ORDER BY 진료시간, ROWNUM) AS 이전환자명, LAG(진료시간) OVER(PARTITION BY 진료과목 ORDER BY 진료시간, ROWNUM) AS 이전진료시간, LEAD(진료시간) OVER(PARTITION BY 진료과목 ORDER BY 진료시간, ROWNUM) AS 진료예정시간 FROM 진료차트 WHERE 1=1 AND 접수시간 >= TO_DATE('20170430 22','YYYYMMDD HH24') AND 접수시간 < TO_DATE('20170501 05','YYYYMMDD HH24') )
병원명 |
진료과목 | 환자명 | 진료시간 | 이전진료시간 | 다음환자명 | 진료예정시간 |
바른치과 | 충치 | 홍길동 | 4/30 1시00분 | 홍길동 | 4/30 1시30분 | |
바른치과 | 충치 | 홍길동 | 4/30 1시30분 | 4/30 1시00분 | 홍길동 | 4/30 1시40분 |
바른치과 | 충치 | 홍길동 | 4/30 1시40분 | 4/30 1시30분 | 홍길동 | 4/30 2시05분 |
바른치과 | 충치 | 홍길동 | 4/30 2시05분 | 4/30 1시40분 | 남도일 | 4/30 2시50분 |
바른치과 | 충치 | 남도일 | 4/30 2시50분 | 4/30 2시05분 | 남도일 | 4/30 3시00분 |
바른치과 | 충치 | 남도일 | 4/30 3시00분 | 4/30 2시50분 | 홍길동 | 4/30 4시00분 |
바른치과 | 충치 | 홍길동 | 4/30 4시00분 | 4/30 3시00분 | 홍길동 | 4/30 4시20분 |
바른치과 | 충치 | 홍길동 | 4/30 4시20분 | 4/30 4시00분 | ||
바른치과 | 신경 | 심봉사 | 4/30 4시30분 | 허태풍 | 4/30 5시00분 |
DATA가 이런식으로 나오는데, 회색 부분처럼 연속적으로 동일한 사람이 진료를 받았으면, 한번으로 묶고,
비연속일 때에는 따로 진료했다고 보고 싶어요~
얻고 싶은 결과값)) 본문에 안써져서 댓글에 남겨요~^^;;
병원명 |
진료과목 | 환자명 | 진료시간 | 이전진료시간 | 다음환자명 | 진료예정시간 |
바른치과 | 충치 | 홍길동 | 4/30 1시00분 | 남도일 | 4/30 2시50분 | |
바른치과 | 충치 | 남도일 | 4/30 2시50분 | 4/30 1시00분 | 홍길동 | 4/30 4시00분 |
바른치과 | 충치 | 홍길동 | 4/30 4시00분 | 4/30 2시50분 | 허태풍 | 4/30 4시30분 |
바른치과 | 신경 | 심봉사 | 4/30 4시30분 | 허태풍 | 4/30 5시00분 | |
바른치과 | 신경 | 허태풍 | 4/30 5시00분 | 4/30 4시30분 | 남도일 | 4/30 5시40분 |
바른치과 | 충치 | 허태풍 | 4/30 4시30분 | 4/30 4시00분 | ||
WITH 진료차트 AS ( SELECT '바른치과' 병원명, '충치' 진료과목, '홍길동' 환자명, '4/30 1시00분' 진료시간 FROM dual UNION ALL SELECT '바른치과', '충치', '홍길동', '4/30 1시30분' FROM dual UNION ALL SELECT '바른치과', '충치', '홍길동', '4/30 1시40분' FROM dual UNION ALL SELECT '바른치과', '충치', '홍길동', '4/30 2시05분' FROM dual UNION ALL SELECT '바른치과', '충치', '남도일', '4/30 2시50분' FROM dual UNION ALL SELECT '바른치과', '충치', '남도일', '4/30 3시00분' FROM dual UNION ALL SELECT '바른치과', '충치', '홍길동', '4/30 4시00분' FROM dual UNION ALL SELECT '바른치과', '충치', '홍길동', '4/30 4시20분' FROM dual UNION ALL SELECT '바른치과', '신경', '심봉사', '4/30 4시30분' FROM dual UNION ALL SELECT '바른치과', '충치', '허태풍', '4/30 4시30분' FROM dual UNION ALL SELECT '바른치과', '신경', '허태풍', '4/30 5시00분' FROM dual ) SELECT 병원명, 진료과목, 환자명 , MIN(진료시간) 진료시간 , LAG (MIN(진료시간)) OVER(PARTITION BY 병원명, 진료과목 ORDER BY MIN(진료시간)) 이전진료시간 , LEAD( 환자명 ) OVER(PARTITION BY 병원명, 진료과목 ORDER BY MIN(진료시간)) 다음환자명 , LEAD(MIN(진료시간)) OVER(PARTITION BY 병원명, 진료과목 ORDER BY MIN(진료시간)) 진료예정시간 FROM (SELECT 병원명, 진료과목, 환자명, 진료시간 , ROW_NUMBER() OVER(PARTITION BY 병원명, 진료과목 ORDER BY 진료시간) rn1 , ROW_NUMBER() OVER(PARTITION BY 병원명, 진료과목, 환자명 ORDER BY 진료시간) rn2 FROM 진료차트 WHERE 1=1 ) GROUP BY 병원명, 진료과목, 환자명, rn1-rn2 ORDER BY 병원명, 진료시간 ;