SCD-2 마스터 빌더
소스 테이블에서 느린 변경 차원 유형 2(SCD-2) 이력 테이블을 구축합니다. 일반 마스터 테이블은 각 키의 오늘 값만 유지하지만, SCD-2 테이블은 키가 가졌던 모든 값을 유효했던 날짜 범위와 함께 유지합니다. 이를 통해 *지금 이 고객은 어느 지역에 있습니까?*뿐 아니라 *거래 당일에 이 고객은 어느 지역에 있었습니까?*와 같은 특정 시점의 질문에 답할 수 있습니다.
실행할 때마다 소스 스냅샷을 이전 이력과 비교하여, 추적 속성이 변경된 키는 이전 버전을 닫고 새 버전을 엽니다. 테이블은 다시 계산되어 원자적으로 교체되므로 같은 입력으로 다시 실행하면 같은 결과가 나옵니다.
특정 시점의 값을 팩트 테이블에 연결하려면 이 단계를 SCD-2 기준일 조인과 함께 사용하십시오.
출력 열
섹션 제목: “출력 열”실행할 때마다 전달되는 열과 함께 예약된 열 세 개가 출력됩니다. 이 열의 이름은 지정할 수 없으며 항상 valid_from, valid_to, is_current입니다. 비즈니스 키 열과 추적 열은 이 이름을 사용할 수 없습니다.
| 열 | 의미 |
|---|---|
valid_from |
이 버전이 효력을 가지기 시작한 날짜입니다(포함). |
valid_to |
이 버전이 효력을 잃은 날짜입니다(미포함). 열린(현재) 행은 기준 최대 날짜 9999-12-31을 가집니다. |
is_current |
현재 유효한 버전이면 true, 닫힌 이력이면 false입니다. |
테이블
섹션 제목: “테이블”소스 테이블
섹션 제목: “소스 테이블”마스터 데이터의 현재 스냅샷입니다. 비즈니스 키당 한 행이며 오늘의 속성 값을 담고 있습니다.
Prior SCD-2 Table(선택 사항)
섹션 제목: “Prior SCD-2 Table(선택 사항)”이전 실행에서 만든 기존 이력 테이블입니다. 첫 번째 실행에서는 비워 두거나 결과 테이블을 가리키게 하십시오. 그러면 이 단계가 처음부터 전체 이력을 구축하여 유효 날짜에 소스 행당 하나의 버전을 엽니다.
결과 테이블
섹션 제목: “결과 테이블”다시 구축한 이력을 쓸 위치입니다. 뷰가 아니라 테이블이어야 합니다.
유효 날짜 및 옵션
섹션 제목: “유효 날짜 및 옵션”실행할 때마다 변경 내용에 하나의 유효 날짜가 기록됩니다. 다음 두 가지 방법 중 정확히 하나로 지정하십시오. 둘 다 지정하거나 둘 다 지정하지 않으면 오류입니다.
- 유효 날짜 열 — 소스에서 유효 날짜를 담고 있는 열입니다. 모든 소스 행에서 같은 값이어야 합니다(스냅샷은 하나의 날짜 기준입니다).
- 유효 날짜 — 전체 실행에 적용되는
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는 변경되지 않아 그대로 두었습니다.
관련 항목
섹션 제목: “관련 항목”- SCD-2 기준일 조인 — 특정 시점의 값을 팩트 테이블에 연결합니다.
- Dimension Load 단계 — 테이블에서 계층을 로드합니다.