홈 › SQL 실무 › 03 / 9

이력 테이블과 시점 조회

유효 기간, 최신 상태, 특정 날짜의 상태, 기간 겹침
섹션 6진행 0 / 9

6. 정리

이력 테이블은 행마다 valid_from, valid_to 를 두고 값이 바뀌면 행을 닫고 새로 씁니다. 끝을 포함하지 않는 반개구간 [시작, 끝) 을 쓰면 다음 행의 시작이 이전 행의 끝과 같아서 조건이 단순해집니다. 현재 행은 valid_to = DATE '9999-12-31' 입니다.

현재 상태는 valid_to = 9999-12-31, 날짜 d 의 상태는 valid_from <= d AND d < valid_to 입니다. 주문 같은 다른 표와는 같은 조건을 조인에 넣는 시점 조인으로 붙입니다. BETWEEN 은 끝을 포함하므로 쓰지 않습니다.

변경 처리는 현재 행의 valid_to 를 변경일로 닫는 UPDATE 와 새 행 INSERT 를 한 트랜잭션으로 묶습니다. 겹침 검사는 a.valid_from < b.valid_to AND b.valid_from < a.valid_to, 구멍 검사는 LAG 로 이전 valid_to 를 가져와 비교합니다. 이 네 DB 에는 겹침을 막는 선언적 제약이 없어서 저장 전 검사나 트리거로 막습니다.

valid_to 를 NULL 로 두면 조건이 복잡해지고 COALESCE 가 인덱스를 막으며 Oracle 은 IS NULL 에도 인덱스를 못 씁니다.

MSSQL 2016 의 시스템 버전 임시 테이블, Oracle 의 Flashback Query 와 12c Temporal Validity 는 참고용이고, DB 가 기록한 시각과 업무상 유효 기간은 다릅니다. 다음 레슨은 이 이력과 주문을 월·분기별로 묶는 기간별 통계 보고서를 다룹니다.