안녕하세요 인사쪽맡고있는 전산팀입니다. 쿼리짜다가 급막혀서 글을남깁니다.
select 날짜, 부서
from 부서이력테이블 이렇게 딱 치면요
3월 인사팀
4월 인사팀
5월 인사팀
6월 회계팀
7월 회계팀
8월 총무팀
9월 인사팀
이렇게 조회된다고 가정합니다.
그런데 제가원하는 데이터는 그사람의 부서 이력을 뽑아내야해서요
3월 인사팀
6월 회계팀
8월 총무팀
9월 인사팀
이렇게 결과값이 나와야 해서요 방법이 있을까요ㅜ 은근히 어렵네요 진짜..
다시 설명드리면 해당직원이 1~6월 인사팀, 7~9월 총무팀, 10월~12월 인사팀 있었으면
12월 12건 다 보여주는게 아니라 1월인사팀, 7월 총무팀, 10월 인사팀 딱 3건만 보여주는거죠
답변 꼭 부탁드립니다!!! ㅠ
WITH 부서이력테이블(날짜, 부서) AS( SELECT '3월', '인사팀' FROM dual UNION ALL SELECT '4월', '인사팀' FROM dual UNION ALL SELECT '5월', '인사팀' FROM dual UNION ALL SELECT '6월', '회계팀' FROM dual UNION ALL SELECT '7월', '회계팀' FROM dual UNION ALL SELECT '8월', '총무팀' FROM dual UNION ALL SELECT '9월', '인사팀' FROM dual ) SELECT 날짜, 부서 FROM ( SELECT 날짜, 부서, ROW_NUMBER() OVER(PARTITION BY gr ORDER BY 날짜) rn FROM ( SELECT 날짜, 부서, SUM(lg) OVER(ORDER BY 날짜) gr FROM ( SELECT 날짜, 부서, CASE WHEN 부서 = LAG(부서, 1) OVER(ORDER BY 날짜) THEN 0 ELSE 1 END lg FROM 부서이력테이블 ) ) ) WHERE rn = 1 ORDER BY 날짜 쓸떼없이 긴것 같네요;
WITH dept_hist(month, dept) AS( SELECT '3월', '인사팀' FROM dual UNION ALL SELECT '4월', '인사팀' FROM dual UNION ALL SELECT '5월', '인사팀' FROM dual UNION ALL SELECT '6월', '회계팀' FROM dual UNION ALL SELECT '7월', '회계팀' FROM dual UNION ALL SELECT '8월', '총무팀' FROM dual UNION ALL SELECT '9월', '인사팀' FROM dual ) SELECT MONTH, DEPT FROM (SELECT MONTH, DEPT, CASE WHEN DEPT = LAG(DEPT, 1) OVER(ORDER BY MONTH) THEN 0 ELSE 1 END LG FROM DEPT_HIST) WHERE LG = 1 ORDER BY MONTH ASC;
이렇게 하면 좀 더 짧아지겠네요.
WITH T AS ( SELECT 3 MONTH, '인사팀' DEPT FROM DUAL UNION ALL SELECT 4 MONTH, '인사팀' DEPT FROM DUAL UNION ALL SELECT 5 MONTH, '인사팀' DEPT FROM DUAL UNION ALL SELECT 6 MONTH, '회계팀' DEPT FROM DUAL UNION ALL SELECT 7 MONTH, '회계팀' DEPT FROM DUAL UNION ALL SELECT 8 MONTH, '총무팀' DEPT FROM DUAL UNION ALL SELECT 9 MONTH, '인사팀' DEPT FROM DUAL ) SELECT MIN(MONTH) MONTH, DEPT FROM (SELECT MONTH , DEPT , MONTH - LAG(MONTH, 1, MONTH - 1) OVER(PARTITION BY DEPT ORDER BY DEPT ASC, MONTH ASC) LAG_MONTH FROM T ORDER BY MONTH ASC) GROUP BY LAG_MONTH, DEPT ORDER BY MONTH ASC;
전 이렇게 짜보았습니다.