현재 상태와 이력을 별개의 테이블로 관리하는 곳도 있지만
둘을 분리하지 않고 이력테이블에서 최종 데이터를 읽어오도록 설계하는 곳도 꽤나 많다
이럴 경우에는 그동안 아래와 같이 쿼리를 짜곤했다.
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 | 입실 |
[출처] 이력 테이블에서 최종 데이터만 조회하기|작성자 깽이
'DATABASE(SQL)' 카테고리의 다른 글
데이터베이스에서 null 과 빈 문자열(empty string)의 차이점 (0) | 2020.03.23 |
---|---|
Maria DB (1) | 2020.03.23 |
DB모델링 - Entity, Attribute, Identifier, Relation (0) | 2020.01.03 |
DB모델링 - 기본 개념, 절차, 원칙, 정규화, 역정규화, 이력관리 (0) | 2020.01.03 |
ORACLE LIMIT 기능 구현 (0) | 2019.10.29 |