[Oracle] 최근 데이터만 가져오기, 최근 이력가져오기 - KEEP

 

실무에서 맞닿드린 상황은, History(이력) 테이블에서 가장 최근 적재된 이력 중 "사용자 메모"에 대한 값을 가져오는 방법이다.

집계함수와 함께 사용되는 이 키워드를 통해

현재 적재된 메모 이력개수와 가장 최근에 기록한 메모를 추출하는 예제로 설명한다.


1. 예제 데이터

[TMP_TEST_01]

  • REG_DT : 등록날짜
  • MEMO : 사용자 메모



2. 등록일 기준 마지막(최근)에 등록된 메모내용 조회

SELECT COUNT(*) || '개' AS MENO_CNT,
       MAX(MEMO) KEEP (DENSE_RANK LAST ORDER BY REG_DT ) AS CURR_MEMO
FROM TMP_TEST_01;

[결과]

[설명]


조건절(WHERE)을 추가할 경우, 조건에 부합하는 조회 대상들을 대상으로 동작한다.
KEEP은 단어상의 의미처럼 "SELECT" 영역에서 괄호안의 대상을 유지하는 것으로 이해할 수 있다.


또한, 위 쿼리의 "LAST" 부분을 "FIRST"로 변경하면 반대로 첫번째 데이터를 추출한다.

SELECT COUNT(*) || '개' AS MENO_CNT,
       MAX(MEMO) KEEP (DENSE_RANK FIRST ORDER BY REG_DT ) AS CURR_MEMO
FROM TMP_TEST_01;

[결과]



3. 테스트 데이터

create table TMP_TEST_01
(
    SEQ    NUMBER,
    REG_DT DATE,
    PK_KEY VARCHAR2(10),
    MEMO   VARCHAR2(200)
)
INSERT INTO TMP_TEST_01(SEQ, REG_DT, PK_KEY, MEMO) VALUES (SAMPLE_SEQ_01.nextval, TO_DATE('2022-04-05'), 'CODE_A', '첫번째 메모' );
INSERT INTO TMP_TEST_01(SEQ, REG_DT, PK_KEY, MEMO) VALUES (SAMPLE_SEQ_01.nextval, TO_DATE('2022-04-06'), 'CODE_A', '두번째 메모' );
INSERT INTO TMP_TEST_01(SEQ, REG_DT, PK_KEY, MEMO) VALUES (SAMPLE_SEQ_01.nextval, TO_DATE('2022-04-07'), 'CODE_A', '세번째 메모' );
INSERT INTO TMP_TEST_01(SEQ, REG_DT, PK_KEY, MEMO) VALUES (SAMPLE_SEQ_01.nextval, TO_DATE('2022-04-08'), 'CODE_A', '네번째 메모' );
INSERT INTO TMP_TEST_01(SEQ, REG_DT, PK_KEY, MEMO) VALUES (SAMPLE_SEQ_01.nextval, TO_DATE('2022-04-09'), 'CODE_A', '다섯번째 메모' );
INSERT INTO TMP_TEST_01(SEQ, REG_DT, PK_KEY, MEMO) VALUES (SAMPLE_SEQ_01.nextval, TO_DATE('2022-04-10'), 'CODE_A', '여섯번째 메모' );


0 댓글