안녕하세요
쿼리를짜다가 궁금한점이있어서 질문드립니다.
사원별 일자를 보고싶은데, 연결된일자는 그룹으로 묶어서 보고싶습니다.
예시)
SELECT 'A' AS "사원", '20190816' AS "일자" FROM DUAL UNION ALL SELECT 'A', '20190817' FROM DUAL UNION ALL SELECT 'A', '20190818' FROM DUAL UNION ALL SELECT 'A', '20190822' FROM DUAL UNION ALL SELECT 'A', '20190823' FROM DUAL UNION ALL SELECT 'B', '20190901' FROM DUAL UNION ALL SELECT 'B', '20190902' FROM DUAL UNION ALL SELECT 'B', '20190905' FROM DUAL
사원 일자
A 20190816
A 20190817
A 20190818
A 20190822
A 20190823
B 20190901
B 20190902
B 20190905
원하는 결과값
사원 시작일 종료일
A 20190816 20190818
A 20190822 20190823
B 20190901 20190902
B 20190905 20190905
뭔가 레벨이 들어갈거같고, 사원별이니 GROUP BY가 들어갈거같고.. 로우를 이전일자와 비교해서 하루차이를 체크해야 할 것 같은데 감이 안잡혀서 질문드립니다.
감사합니다.
WITH T1 AS ( SELECT 'A' AS "사원", '20190816' AS "일자" FROM DUAL UNION ALL SELECT 'A', '20190817' FROM DUAL UNION ALL SELECT 'A', '20190818' FROM DUAL UNION ALL SELECT 'A', '20190822' FROM DUAL UNION ALL SELECT 'A', '20190823' FROM DUAL UNION ALL SELECT 'B', '20190901' FROM DUAL UNION ALL SELECT 'B', '20190902' FROM DUAL UNION ALL SELECT 'B', '20190905' FROM DUAL ) SELECT 사원 ,Min(일자) 시작일 ,Max(일자) 종료일 FROM ( SELECT 사원 ,일자 ,FLAG ,Sum(FLAG) OVER(PARTITION BY 사원 ORDER BY 일자) RST FROM ( SELECT CASE WHEN 일자-1 = Lag(일자) OVER (ORDER BY 일자) THEN 0 ELSE 1 END FLAG ,사원 ,일자 FROM T1 ) ) GROUP BY 사원,RST ORDER BY 시작일;
WITH t AS ( SELECT 'A' 사원, '20190816' 일자 FROM dual UNION ALL SELECT 'A', '20190817' FROM dual UNION ALL SELECT 'A', '20190818' FROM dual UNION ALL SELECT 'A', '20190822' FROM dual UNION ALL SELECT 'A', '20190823' FROM dual UNION ALL SELECT 'B', '20190901' FROM dual UNION ALL SELECT 'B', '20190902' FROM dual UNION ALL SELECT 'B', '20190905' FROM dual ) SELECT 사원 , MIN(일자) 시작일 , MAX(일자) 종료일 FROM (SELECT 사원, 일자 FROM t ORDER BY 사원, 일자) GROUP BY 사원, TO_DATE(일자, 'yyyymmdd') - ROWNUM ORDER BY 사원, 시작일 ; -- http://gurubee.net/lecture/2194