728x90
반응형

현재 상태와 이력을 별개의 테이블로 관리하는 곳도 있지만

둘을 분리하지 않고 이력테이블에서 최종 데이터를 읽어오도록 설계하는 곳도 꽤나 많다


이럴 경우에는 그동안 아래와 같이 쿼리를 짜곤했다.


SELECT 원하는 컬럼들...

FROM 테이블명

WHERE (키값, 최종이력날짜) IN (SELECT 키값, MAX(이력날짜)

                                     FROM 테이블명

                                     GROUP BY 키값)


IN 을 쓰든 EXISTS를 쓰던 그건 테이블의 데이터 크기나 구조에 따라서 달라질 수는 있지만

아무튼 최종 데이터를 읽으려면 위와 같이 쓰는 수밖에 없었다.


이 부분을 해결한게 있으니 바로 KEEP DENSE_RANK LAST (혹은 FIRST) 이다.


위와 똑같은 쿼리를 KEEP DENSE_RANK LAST를 쓰게 되면 아래와 같다.

SELECT MAX(컬럼1) KEEP (DENSE_RANK LAST ORDER BY 이력날짜),

         MAX(컬럼2) KEEP (DENSE_RANK LAST ORDER BY 이력날짜), 

         MAX(컬럼3) KEEP (DENSE_RANK LAST ORDER BY 이력날짜)

         .....

FROM 테이블명

GROUP BY 키값;


예제를 들어 설명해보자면 아래와 같다


사원들이 사무실을 출입할때마다 카드를 찍고 해당 이력이 EMP_ENTER_HIST라는 테이블에 쌓는다.

사원번호 (EMP_NO)

출입구분(ENTER_IND)

 이력시간 (HIST_TIME)

00251

 입실

 2015.02.25 09:00

00251

 퇴실

 2015.02.25 11:30

00251

 입실

 2015.02.25 12.03

00588

 입실

 2015.02.25 08:30 

00588

 퇴실 

 2015.02.25 13:40

00012

 입실 

 2015.02.25 08:00 


위와 같이 데이터가 쌓이고 있을때

사원별로 누가 재실해있고 누가 퇴실했는지를 확인하고자 한다면 아래와 같이 쿼리를 날린다.


SELECT MAX(ENTER_IND) KEEP (DENSE_RANK LAST ORDER BY HIST_TIME)

FROM EMP_ENTER_HIST

GROUP BY EMP_NO

;


그 결과값은 아래와 같이 나온다.


 

사원번호 출입구분
00251 입실
00588 퇴실
00012 입실

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,