ItemPrcHist 테이블 살펴보기


지금까지 살펴본 조인은 모두 같다(=) 조건을 사용했다. 그러다보니, 조인 조건에는 같다(=) 조건만 사용할 수 있다고 착각할 수 있다. 대부분 테이블 간의 PK/FK의 참조 관계에서 조인이 많이 발생하다 보니 같다(=) 조건을 많이 사용하게 될 뿐이다. 다양한 업무를 처리하다 보면, PK/FK가 아님에도 조인이 발생하게 된다. 그리고 이 과정에서 같다(=) 조건이 아닌 다른 조건을 사용해야 할 수도 있다.

아래는 Item(상품)과 ItemPrcHist(상품가격이력)의 테이블구조다. 일반적으로 상품의 가격과 같은 정보는 시점에 따라 변한다. 이러한 가격 데이터를 관리하기 위한 다양한 방법이 있는데, 그 중에 하나가 아래 ERD의 상품가격이력 테이블과 같이 가격의 시작일자와 종료일자를 추가해 관리하는 방법이다. 이처럼 시작일자와 종료일자를 사용해 데이터의 변화를 관리하는 구조를 선분이력구조라고 한다.

Untitled

Untitled

Tip. 선분이력구조 데이터의 구간별 변화를 시작시점과 종료시점 구간으로 관리하는 방법이다. 이와 같은 방법은 데이터 조회에 유리한 부분이 있으나, 데이터 입력시 선분이 중복되지 않도록 처리하면서, 선분일자를 조정하는 부분이 까다로운 편이다. 로직 실수로 중복된 구간이 입력되면 데이터 처리에 큰 문제가 생기기도 한다. 그럼에도 불구하고 선분이력을 선택해 조회 SQL의 복잡함을 제거하는 것이 전체적으로 더 좋을 가능성이 높다.

상품(Item) 테이블은 지금까지 계속 사용해왔기 때문에 익숙할 것이다. 상품의 가격 변화를 관리하는 상품가격이력(ItemPrcHist)의 데이터를 살펴보자.

-- [SQL-7-8-1]
-- 아메리카노(R)과 아인슈패너(R)의 가격이력을 조회
SELECT  T1.ItemId ,T1.FromDt ,T1.ToDt ,T1.SalePrc
FROM    startdb.ItemPrcHist T1
WHERE   T1.ItemId IN ('AMR','EINR');

ItemId  FromDt      ToDt        SalePrc   
------  ----------  ----------  --------  
AMR     2010-01-01  2022-12-31  4000.000  
AMR     2023-01-01  2099-12-31  4500.000  
EINR    2023-04-01  2023-12-31  5500.000  
EINR    2024-01-01  2024-01-15  5800.000  
EINR    2024-01-16  2099-12-31  6300.000  

ItemPrcHist를 통해 상품별로 가격 변화를 확인할 수 있다. AMR(아메리카노(R))의 경우, 2010년부터 2022년 12월말까지 4,000원이었으나, 2023년부터 4,500원으로 가격이 변경되었다. EINR(아인슈패너)은 2023년 4월부터 2023년 12월말까지는 5,500원이었고, 2024년 1월 1일부터 2024년 1월 15일까지 보름 동안은 5,800원이었다. 그리고 2024년 1월 16일부터 2099년 12월 31일까지는 6,300원이다. 2099년이 오려면 아직 멀었다. 선분이력구조에서 마지막 데이터의 끝 날자는 일부러 큰 값을 고정해서 사용한다. 해당 테이블에서 특정 시점의 데이터를 검색하려면 From과 To가 모두 조건으로 사용되므로 To 값이 반드시 채워져 있어야 하기 때문이다.

AMR과 EINR의 2023년 10월 1일 기준의 가격을 조회하려면 다음과 같이 SQL을 작성하면 된다.

-- [SQL-7-8-2]
-- 아메리카노(R)과 아인슈패너(R)의 2023년 10월 1일의 가격을 조회
SELECT  T1.ItemId ,T1.FromDt ,T1.ToDt ,T1.SalePrc
FROM    startdb.ItemPrcHist T1
WHERE   T1.ItemId IN ('AMR','EINR')
AND     T1.FromDt <= STR_TO_DATE('20231001','%Y%m%d')
AND     T1.ToDt   >= STR_TO_DATE('20231001','%Y%m%d');

ItemId  FromDt      ToDt        SalePrc   
------  ----------  ----------  --------  
AMR     2023-01-01  2099-12-31  4500.000  
EINR    2023-04-01  2023-12-31  5500.000