쿼으리 도움 부탁드립니다.^ㅡ^ 0 5 2,047

by 뽀꼼여사 [SQL Query] SQL DB ORACLE QUERY [2017.07.05 14:30:18]


※ 필수 조건 : 병원명 / 진료과목 / 환자명은 다양하게 발생함

※ 병원명/진료과목/환자명이 연속으로 동일한 경우 여러번의 진료시간(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')
    )

 

by 뽀꼼여사 [2017.07.05 14:45:56]

병원명

진료과목 환자명 진료시간 이전진료시간 다음환자명 진료예정시간
바른치과 충치 홍길동 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가 이런식으로 나오는데, 회색 부분처럼 연속적으로 동일한 사람이 진료를 받았으면, 한번으로 묶고,

비연속일 때에는 따로 진료했다고 보고 싶어요~


by 뽀꼼여사 [2017.07.05 14:54:14]

얻고 싶은 결과값))   본문에 안써져서 댓글에 남겨요~^^;;

병원명

진료과목 환자명 진료시간 이전진료시간 다음환자명 진료예정시간
바른치과 충치 홍길동 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분    
             
             
             

by 마농 [2017.07.05 16:29:15]
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 병원명, 진료시간
;

 


by 뽀꼼여사 [2017.07.05 17:40:33]

ROW_NUMBER를 활용하는데 매우 미흡해요~~

그러다보니, ROW_NUMBER를 써야하는 것 같은데 어떻게 써야할지 몰라서 계속 막히더라구요~

알려주신 방법으로 한번 만들어볼께요~! 도움 감사드립니다.^^


by jkson [2017.07.05 17:59:47]

병원이당~~^0^

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