안녕하세요
쿼리를짜다가 궁금한점이있어서 질문드립니다.
사원별 일자를 보고싶은데, 연결된일자는 그룹으로 묶어서 보고싶습니다.
예시)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
1 | 사원 일자 |
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가 들어갈거같고.. 로우를 이전일자와 비교해서 하루차이를 체크해야 할 것 같은데 감이 안잡혀서 질문드립니다.
감사합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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 시작일; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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 사원, 시작일 ; |