기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Teradata NORMALIZE 임시 기능을 Amazon Redshift SQL로 변환
작성자: Po Hong(AWS)
요약
정규화는 ANSI SQL 표준의 테라데이타 확장입니다. SQL 테이블에 기간 데이터 유형의 열이 포함된 경우 정규화는 해당 열과 일치하거나 겹치는 값을 결합하여 여러 개별 기간 값을 통합하는 단일 기간을 형성합니다. 정규화를 사용하려면 SQL 선택 목록에서 하나 이상의 열이 Teradata의 임시 기간 데이터 유형이어야 합니다. 정규화에 대한 자세한 내용은 Teradata 설명서
Amazon Redshift는 정규화를 지원하지 않지만 Amazon Redshift의 네이티브 SQL 구문과 LAG 윈도우 함수를 사용하여 이 기능을 구현할 수 있습니다. 이 패턴은 가장 많이 사용되는 형식인 ON MEETS 또는 OVERLAPS 조건과 함께 테라데이타 정규화 확장 프로그램을 사용하는 데 중점을 둡니다. 테라데이타에서 이 기능이 작동하는 방식과 이 기능을 Amazon Redshift 네이티브 SQL 구문으로 변환하는 방법을 설명합니다.
사전 조건 및 제한 사항
사전 조건
테라데이타 SQL에 대한 기본 지식 및 경험
Amazon Redshift에 대한 지식과 경험
아키텍처
소스 기술 스택
Teradata 데이터 웨어하우스
대상 기술 스택
Amazon Redshift
대상 아키텍처
Teradata 데이터베이스를 Amazon Redshift로 마이그레이션하기 위한 전체적인 아키텍처는 AWS SCT 데이터 추출 에이전트를 사용하여 Teradata 데이터베이스를 Amazon Redshift로 마이그레이션 패턴을 참조하세요. 마이그레이션은 테라데이타 정규화 구문을 Amazon Redshift SQL로 자동으로 변환하지 않습니다. 이 패턴의 지침에 따라 이 테라데이타 확장을 변환할 수 있습니다.
도구
코드
정규화의 개념과 기능을 설명하려면 Teradata에 있는 다음 테이블 정의를 살펴보세요.
CREATE TABLE systest.project
( emp_id INTEGER,
project_name VARCHAR(20),
dept_id INTEGER,
duration PERIOD(DATE)
);
다음 SQL 코드를 실행하여 샘플 데이터를 테이블에 삽입합니다.
BEGIN TRANSACTION;
INSERT INTO systest.project VALUES (10, 'First Phase', 1000, PERIOD(DATE '2010-01-10', DATE '2010-03-20') );
INSERT INTO systest.project VALUES (10, 'First Phase', 2000, PERIOD(DATE '2010-03-20', DATE '2010-07-15') );
INSERT INTO systest.project VALUES (10, 'Second Phase', 2000, PERIOD(DATE '2010-06-15', DATE '2010-08-18') );
INSERT INTO systest.project VALUES (20, 'First Phase', 2000, PERIOD(DATE '2010-03-10', DATE '2010-07-20') );
INSERT INTO systest.project VALUES (20, 'Second Phase', 1000, PERIOD(DATE '2020-05-10', DATE '2020-09-20') );
END TRANSACTION;
결과:
select * from systest.project order by 1,2,3;
*** Query completed. 4 rows found. 4 columns returned.
*** Total elapsed time was 1 second.
emp_id project_name dept_id duration
----------- -------------------- ----------- ------------------------
10 First Phase 1000 ('10/01/10', '10/03/20')
10 First Phase 2000 ('10/03/20', '10/07/15')
10 Second Phase 2000 ('10/06/15', '10/08/18')
20 First Phase 2000 ('10/03/10', '10/07/20')
20 Second Phase 1000 ('20/05/10', '20/09/20')
테라데이타 정규화 사용 사례
이제 선택 문에 테라데이타 정규화 SQL 절을 추가합니다.
SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration
FROM systest.project
ORDER BY 1,2;
이 정규화 작업은 단일 열(emp_id)에서 수행됩니다. emp_id=10의 경우 다음과 같이 기간에서 겹치는 세 개의 기간 값이 단일 기간 값으로 합쳐집니다.
emp_id duration
----------- ------------------------
10 ('10/01/10', '10/08/18')
20 ('10/03/10', '10/07/20')
20 ('20/05/10', '20/09/20')
다음 선택 문은 project_name 및 dept_id.에 대해 정규화 작업을 수행합니다. 참고로 선택 목록에는 기간 열인 기간 하나만 포함되어 있습니다.
SELECT NORMALIZE project_name, dept_id, duration
FROM systest.project;
출력:
project_name dept_id duration
-------------------- ----------- ------------------------
First Phase 1000 ('10/01/10', '10/03/20')
Second Phase 1000 ('20/05/10', '20/09/20')
First Phase 2000 ('10/03/10', '10/07/20')
Second Phase 2000 ('10/06/15', '10/08/18')
Amazon Redshift에 해당하는 SQL
Amazon Redshift는 현재 테이블의 기간 데이터 유형을 지원하지 않습니다. 대신 다음과 같이 테라데이타 기간 데이터 필드를 start_date, end_date의 두 부분으로 나누어야 합니다.
CREATE TABLE systest.project
( emp_id INTEGER,
project_name VARCHAR(20),
dept_id INTEGER,
start_date DATE,
end_date DATE
);
다음 테이블에 샘플 데이터를 삽입합니다.
BEGIN TRANSACTION;
INSERT INTO systest.project VALUES (10, 'First Phase', 1000, DATE '2010-01-10', DATE '2010-03-20' );
INSERT INTO systest.project VALUES (10, 'First Phase', 2000, DATE '2010-03-20', DATE '2010-07-15');
INSERT INTO systest.project VALUES (10, 'Second Phase', 2000, DATE '2010-06-15', DATE '2010-08-18' );
INSERT INTO systest.project VALUES (20, 'First Phase', 2000, DATE '2010-03-10', DATE '2010-07-20' );
INSERT INTO systest.project VALUES (20, 'Second Phase', 1000, DATE '2020-05-10', DATE '2020-09-20' );
END TRANSACTION;
출력:
emp_id | project_name | dept_id | start_date | end_date
--------+--------------+---------+------------+------------
10 | First Phase | 1000 | 2010-01-10 | 2010-03-20
10 | First Phase | 2000 | 2010-03-20 | 2010-07-15
10 | Second Phase | 2000 | 2010-06-15 | 2010-08-18
20 | First Phase | 2000 | 2010-03-10 | 2010-07-20
20 | Second Phase | 1000 | 2020-05-10 | 2020-09-20
(5 rows)
테라데이타의 정규화 절을 다시 작성하려면 Amazon Redshift의 LAG 윈도우 함수를 사용하시면 됩니다. 이 함수는 파티션에서 현재 행 위(앞)의 지정 오프셋에 위치한 행의 값을 반환합니다.
LAG 함수를 사용하면 기간이 이전 기간과 일치하거나 겹치는지를 판단하여 새 기간을 시작하는 각 행을 식별할 수 있습니다(예인 경우 0, 아니요인 경우 1). 이 플래그를 누적하여 합산하면 Amazon Redshift에서 원하는 결과에 도달하기 위해 외부 그룹별 절에서 사용할 수 있는 그룹 식별자가 제공됩니다.
LAG()를 사용하는 Amazon Redshift SQL 문 샘플은 다음과 같습니다.
SELECT emp_id, start_date, end_date,
(CASE WHEN start_date <= LAG(end_date) OVER (PARTITION BY emp_id ORDER BY start_date, end_date) THEN 0 ELSE 1 END) AS GroupStartFlag
FROM systest.project
ORDER BY 1,2;
출력:
emp_id | start_date | end_date | groupstartflag
--------+------------+------------+----------------
10 | 2010-01-10 | 2010-03-20 | 1
10 | 2010-03-20 | 2010-07-15 | 0
10 | 2010-06-15 | 2010-08-18 | 0
20 | 2010-03-10 | 2010-07-20 | 1
20 | 2020-05-10 | 2020-09-20 | 1
(5 rows)
다음 Amazon Redshift SQL 문은 emp_id 열에서만 정규화됩니다.
SELECT T2.emp_id, MIN(T2.start_date) as new_start_date, MAX(T2.end_date) as new_end_date
FROM
( SELECT T1.*, SUM(GroupStartFlag) OVER (PARTITION BY emp_id ORDER BY start_date ROWS UNBOUNDED PRECEDING) As GroupID
FROM ( SELECT emp_id, start_date, end_date,
(CASE WHEN start_date <= LAG(end_date) OVER (PARTITION BY emp_id ORDER BY start_date, end_date) THEN 0 ELSE 1 END) AS GroupStartFlag
FROM systest.project ) T1
) T2
GROUP BY T2.emp_id, T2.GroupID
ORDER BY 1,2;
출력:
emp_id | new_start_date | new_end_date
--------+----------------+------------------------------------
10 | 2010-01-10 | 2010-08-18
20 | 2010-03-10 | 2010-07-20
20 | 2020-05-10 | 2020-09-20
(3 rows)
다음 Amazon Redshift SQL 문은 project_name 열과 dept_id 열 모두에서 정규화됩니다.
SELECT T2.project_name, T2.dept_id, MIN(T2.start_date) as new_start_date, MAX(T2.end_date) as new_end_date
FROM
( SELECT T1.*, SUM(GroupStartFlag) OVER (PARTITION BY project_name, dept_id ORDER BY start_date ROWS UNBOUNDED PRECEDING) As GroupID
FROM ( SELECT project_name, dept_id, start_date, end_date,
(CASE WHEN start_date <= LAG(end_date) OVER (PARTITION BY project_name, dept_id ORDER BY start_date, end_date) THEN 0 ELSE 1 END) AS GroupStartFlag
FROM systest.project ) T1
) T2
GROUP BY T2.project_name, T2.dept_id, T2.GroupID
ORDER BY 1,2,3;
출력:
project_name | dept_id | new_start_date | new_end_date
--------------+---------+----------------+--------------
First Phase | 1000 | 2010-01-10 | 2010-03-20
First Phase | 2000 | 2010-03-10 | 2010-07-20
Second Phase | 1000 | 2020-05-10 | 2020-09-20
Second Phase | 2000 | 2010-06-15 | 2010-08-18
(4 rows)
에픽
작업 | 설명 | 필요한 기술 |
---|---|---|
테라데이타 SQL 코드를 생성합니다. | 필요에 따라 Normalize 문구를 사용합니다. | SQL Developer |
코드를 Amazon Redshift SQL로 변환합니다. | 코드를 변환하려면 이 패턴의 ‘도구’ 섹션에 있는 지침을 따르세요. | SQL Developer |
Amazon Redshift에서 코드를 실행합니다. | 테이블을 생성하고, 테이블에 데이터를 로드하고, Amazon Redshift에서 코드를 실행합니다. | SQL Developer |
관련 리소스
참조
테라데이타 정규화 임시 기능
(테라데이타 설명서) LAG 윈도우 함수(Amazon Redshift 설명서)
Amazon Redshift로 마이그레이션
(AWS 웹 사이트) AWS SCT 데이터 추출 에이전트를 사용하여 테라데이타 데이터베이스를 Amazon Redshift로 마이그레이션(AWS 권장 가이드)
Teradata RESET WHEN 기능을 Amazon Redshift SQL로 변환(AWS 권장 가이드)
도구
파트너