콘텐츠로 이동

소스 테이블에서 느린 변경 차원 유형 2(SCD-2) 이력 테이블을 구축합니다. 일반 마스터 테이블은 각 키의 오늘 값만 유지하지만, SCD-2 테이블은 키가 가졌던 모든 값을 유효했던 날짜 범위와 함께 유지합니다. 이를 통해 *지금 이 고객은 어느 지역에 있습니까?*뿐 아니라 *거래 당일에 이 고객은 어느 지역에 있었습니까?*와 같은 특정 시점의 질문에 답할 수 있습니다.

실행할 때마다 소스 스냅샷을 이전 이력과 비교하여, 추적 속성이 변경된 키는 이전 버전을 닫고 새 버전을 엽니다. 테이블은 다시 계산되어 원자적으로 교체되므로 같은 입력으로 다시 실행하면 같은 결과가 나옵니다.

특정 시점의 값을 팩트 테이블에 연결하려면 이 단계를 SCD-2 기준일 조인과 함께 사용하십시오.

실행할 때마다 전달되는 열과 함께 예약된 열 세 개가 출력됩니다. 이 열의 이름은 지정할 수 없으며 항상 valid_from, valid_to, is_current입니다. 비즈니스 키 열과 추적 열은 이 이름을 사용할 수 없습니다.

열 의미
valid_from 이 버전이 효력을 가지기 시작한 날짜입니다(포함).
valid_to 이 버전이 효력을 잃은 날짜입니다(미포함). 열린(현재) 행은 기준 최대 날짜 9999-12-31을 가집니다.
is_current 현재 유효한 버전이면 true, 닫힌 이력이면 false입니다.

마스터 데이터의 현재 스냅샷입니다. 비즈니스 키당 한 행이며 오늘의 속성 값을 담고 있습니다.

이전 실행에서 만든 기존 이력 테이블입니다. 첫 번째 실행에서는 비워 두거나 결과 테이블을 가리키게 하십시오. 그러면 이 단계가 처음부터 전체 이력을 구축하여 유효 날짜에 소스 행당 하나의 버전을 엽니다.

다시 구축한 이력을 쓸 위치입니다. 뷰가 아니라 테이블이어야 합니다.

실행할 때마다 변경 내용에 하나의 유효 날짜가 기록됩니다. 다음 두 가지 방법 중 정확히 하나로 지정하십시오. 둘 다 지정하거나 둘 다 지정하지 않으면 오류입니다.

  • 유효 날짜 열 — 소스에서 유효 날짜를 담고 있는 열입니다. 모든 소스 행에서 같은 값이어야 합니다(스냅샷은 하나의 날짜 기준입니다).
  • 유효 날짜 — 전체 실행에 적용되는 YYYY-MM-DD 형식의 리터럴 날짜 또는 {current_month} 같은 변수입니다.

기타 옵션:

  • 열린 구간 종료 날짜 — 열린 행의 valid_to에 기록되는 기준값입니다. 기본값은 9999-12-31이며 변경할 이유는 거의 없습니다. SCD-2 기준일 조인에서 사용하는 종료 날짜와 일치해야 합니다.
  • Close on Absence — 사용하도록 설정하면 소스에서 사라진 키는 유효 날짜에 열린 버전이 닫힙니다(해당 키는 폐기된 것으로 처리). 사용하지 않도록 설정하면(기본값) 사라진 키는 기존의 열린 버전을 유지하므로 부분 추출 때문에 이력이 손실되지 않습니다.

YYYY-MM-DD 형식의 실제 날짜가 아닌 리터럴 유효 날짜 또는 열린 구간 종료 날짜, 그리고 종료 날짜와 같거나 그 이후인 유효 날짜는 저장이 거부됩니다. 변수로 지정한 날짜는 검사하지 않습니다.

소스 검사를 사용하여 소스 열을 나열한 다음 각 열에 태그를 지정합니다.

역할 의미
비즈니스 키 시간 경과에 따라 행을 식별하는 자연 키입니다(예: customer_id). 하나 이상 필요합니다. 값은 소스에서 고유해야 하며 null이 아니어야 합니다.
추적 속성 변경되면 새 버전이 열리는 속성입니다(예: region). 하나 이상 필요합니다.
(그대로 유지) 태그를 지정하지 않은 열은 각 버전에 변경 없이 복사되며, 그 자체만으로는 새 버전을 만들지 않습니다.

이전 테이블이 제공되면, 이 단계는 소스 스냅샷을 현재 버전과만 비교하고(닫힌 이력은 비교하지 않음) 키별로 다음과 같이 결정합니다.

상황 결과
추적 속성이 변경되지 않음 아무 작업도 하지 않으며 열린 버전을 그대로 둡니다.
추적 속성이 변경됨 열린 버전이 유효 날짜에 닫히고 새 열린 버전이 삽입됩니다.
유효 날짜가 열린 버전의 valid_from과 같음 당일 재작성으로 처리됩니다. 폭이 0인 구간을 만드는 대신 추적 값을 제자리에서 덮어씁니다.
소스에 키가 없음 열린 상태로 유지됩니다(Close on Absence를 사용하도록 설정한 경우 유효 날짜에 닫힘).

이력을 조용히 손상시키는 대신 실행을 중지시키는 안전 장치:

  • 순서가 어긋난 날짜는 거부됩니다. 유효 날짜는 영향을 받는 각 키의 현재 valid_from보다 이후여야 합니다. 구간을 뒤집는 소급 실행은 폭이 음수인 버전을 만들지 않고 오류와 함께 실패합니다.
  • 중복된 소스 키는 거부됩니다. 소스는 비즈니스 키에서 고유해야 합니다. 중복(또는 null 키)은 조용히 중복 제거되지 않고 실패합니다.
  • 변경 감지는 null 안전하므로 값이 비어 있는 상태로 또는 비어 있는 상태에서 바뀐 경우도 변경으로 올바르게 기록됩니다.

시간에 따라 각 고객이 속한 지역을 추적합니다.

소스 — customer_master(2026-01-01 기준):

customer_id region segment
C1 West SMB
C2 East Enterprise

첫 번째 실행: 소스 테이블 = customer_master, Prior SCD-2 Table = 비어 있음, 결과 테이블 = customer_scd2, 유효 날짜 = 2026-01-01, 비즈니스 키 = customer_id, 추적 속성 = region(segment는 태그를 지정하지 않아 그대로 유지).

첫 번째 실행 후의 customer_scd2:

customer_id region segment valid_from valid_to is_current
C1 West SMB 2026-01-01 9999-12-31 true
C2 East Enterprise 2026-01-01 9999-12-31 true

이제 C1이 Central 지역으로 이동합니다. 소스 — customer_master(2026-04-01 기준):

customer_id region segment
C1 Central SMB
C2 East Enterprise

두 번째 실행: 테이블 역할은 같고, Prior SCD-2 Table = customer_scd2, 유효 날짜 = 2026-04-01.

두 번째 실행 후의 customer_scd2:

customer_id region segment valid_from valid_to is_current
C1 West SMB 2026-01-01 2026-04-01 false
C1 Central SMB 2026-04-01 9999-12-31 true
C2 East Enterprise 2026-01-01 9999-12-31 true

C1의 West 버전이 2026-04-01에 닫히고 Central 버전이 열렸습니다. 반개구간이므로 2026-04-01 날짜의 거래는 West가 아니라 Central에 속합니다. C2는 변경되지 않아 그대로 두었습니다.