Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Convierta la función NORMALIZE temporal de Teradata en Amazon Redshift SQL
Creado por Po Hong () AWS
Origen: almacenamiento de datos de Teradata | Destino: Amazon Redshift | Tipo R: renovar arquitectura |
Entorno: producción | Tecnologías: análisis; bases de datos; migración | Carga de trabajo: todas las demás cargas de trabajo |
AWSservicios: Amazon Redshift |
Resumen
NORMALIZEes una extensión de Teradata del estándar. ANSI SQL Cuando una SQL tabla incluye una columna que tiene un tipo de PERIODdatos, NORMALIZEcombina los valores que coinciden o se superponen en esa columna para formar un período único que consolida varios valores de períodos individuales. Para poder NORMALIZEutilizarla, al menos una columna de la SQL SELECTlista debe ser del tipo de datos temporales PERIODde Teradata. Para obtener más información al respecto NORMALIZE, consulte la documentación de Teradata
Amazon Redshift no es compatible NORMALIZE, pero puede implementar esta funcionalidad mediante el uso de la SQL sintaxis nativa y la función de LAGventana en Amazon Redshift. Este patrón se centra en el uso de la NORMALIZEextensión Teradata con la OVERLAPS condición ON MEETS OR, que es el formato más popular. En él se explica cómo funciona esta función en Teradata y cómo se puede convertir a la sintaxis nativa de Amazon SQL Redshift.
Requisitos previos y limitaciones
Requisitos previos
Conocimientos y experiencia básicos de Teradata SQL
Conocimiento y experiencia en Amazon Redshift
Arquitectura
Pila de tecnología de origen
Almacenamiento de datos de Teradata
Pila de tecnología de destino
Amazon Redshift
Arquitectura de destino
Para obtener una arquitectura de alto nivel para migrar una base de datos de Teradata a Amazon Redshift, consulte el patrón Migración de una base de datos de Teradata a Amazon Redshift mediante agentes de extracción de datos. AWS SCT La migración no convierte automáticamente la NORMALIZEfrase de Teradata a Amazon Redshift. SQL Puede convertir esta extensión de Teradata siguiendo las pautas de este patrón.
Herramientas
Código
Para ilustrar el concepto y la funcionalidad de NORMALIZE, considere la siguiente definición de tabla en Teradata:
CREATE TABLE systest.project ( emp_id INTEGER, project_name VARCHAR(20), dept_id INTEGER, duration PERIOD(DATE) );
Ejecute el siguiente SQL código para insertar datos de ejemplo en la tabla:
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;
Resultados:
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')
Caso de uso de Teradata NORMALIZE
Ahora añada la NORMALIZESQLcláusula Teradata a la declaración: SELECT
SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration FROM systest.project ORDER BY 1,2;
Esta NORMALIZEoperación se realiza en una sola columna (emp_id). Para emp_id=10, los tres valores de período superpuestos en duración se fusionan en un único valor de período, de la siguiente manera:
emp_id duration ----------- ------------------------ 10 ('10/01/10', '10/08/18') 20 ('10/03/10', '10/07/20') 20 ('20/05/10', '20/09/20')
La siguiente SELECTinstrucción realiza una NORMALIZEoperación en project_name y dept_id. Tenga en cuenta que la SELECTlista contiene solo una columna, la duración. PERIOD
SELECT NORMALIZE project_name, dept_id, duration FROM systest.project;
Salida:
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')
Equivalente a Amazon Redshift SQL
Amazon Redshift actualmente no admite el tipo de PERIODdatos de una tabla. En su lugar, debe dividir un campo de PERIODdatos de Teradata en dos partes: fecha de inicio y fecha de finalización, de la siguiente manera:
CREATE TABLE systest.project ( emp_id INTEGER, project_name VARCHAR(20), dept_id INTEGER, start_date DATE, end_date DATE );
Inserte una fila de datos en la tabla:
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;
Salida:
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)
Para reescribir la NORMALIZEcláusula de Teradata, puede utilizar la función de LAG ventana de Amazon Redshift. Esta función devuelve los valores para una fila en un desplazamiento dado arriba (antes) de la fila actual en la partición.
Puede usar la LAGfunción para identificar cada fila que comienza un nuevo período determinando si un período coincide o se superpone con el período anterior (0 en caso afirmativo y 1 en caso negativo). Cuando este indicador se suma de forma acumulativa, proporciona un identificador de grupo que se puede utilizar en la cláusula externa Group By para obtener el resultado deseado en Amazon Redshift.
A continuación, se muestra un ejemplo de SQL declaración de Amazon Redshift que utiliza LAG():
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;
Salida:
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)
La siguiente SQL declaración de Amazon Redshift solo se normaliza en la columna 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;
Salida:
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)
La siguiente SQL declaración de Amazon Redshift se normaliza en las columnas project_name y 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;
Salida:
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)
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree su código de TeradataSQL. | Usa la NORMALIZE frase según tus necesidades. | SQLdesarrollador |
Convierta el código a Amazon RedshiftSQL. | Para convertir el código, siga las instrucciones de la sección «Herramientas» de este patrón. | SQLdesarrollador |
Ejecute el código en Amazon Redshift. | Cree la tabla, cargue los datos en la tabla y ejecute el código en Amazon Redshift. | SQLdesarrollador |
Recursos relacionados
Referencias
Función NORMALIZE temporal de Teradata
(documentación de Teradata) LAGfunción de ventana (documentación de Amazon Redshift)
Migración de una base de datos de Teradata a Amazon Redshift AWS SCT mediante agentes AWS de extracción de datos (Guía prescriptiva)
Convertir la RESET WHEN función Teradata en Amazon SQL Redshift AWS (Guía prescriptiva)
Herramientas
Socios