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.
Convertir la RESET WHEN función 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
RESETWHENes una función de Teradata que se utiliza en las funciones de la ventana SQL analítica. Es una extensión del ANSI SQL estándar. RESETWHENdetermina la partición sobre la que opera una función de SQL ventana en función de alguna condición especificada. Si la condición se evalúa como tal TRUE, se crea una nueva subpartición dinámica dentro de la partición de ventana existente. Para obtener más información al respecto RESETWHEN, consulte la documentación de Teradata
Amazon Redshift no admite funciones RESETWHENde SQL ventana. Para implementar esta funcionalidad, debe convertirla RESETWHENa la SQL sintaxis nativa de Amazon Redshift y utilizar varias funciones anidadas. Este patrón demuestra cómo puede utilizar la RESETWHENfunción Teradata y cómo puede convertirla a la sintaxis de Amazon SQL Redshift.
Requisitos previos y limitaciones
Requisitos previos
Conocimientos básicos del almacén de datos de Teradata y su sintaxis SQL
Buen conocimiento de Amazon Redshift y su sintaxis SQL
Arquitectura
Pila de tecnología de origen
Almacenamiento de datos de Teradata
Pila de tecnología de destino
Amazon Redshift
Arquitectura
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 RESETWHENfrase de Teradata a Amazon Redshift. SQL Puede convertir esta extensión de Teradata siguiendo las pautas de la siguiente sección.
Herramientas
Código
Para ilustrar el concepto de RESETWHEN, considere la siguiente definición de tabla en Teradata:
create table systest.f_account_balance ( account_id integer NOT NULL, month_id integer, balance integer ) unique primary index (account_id, month_id);
Ejecute el siguiente SQL código para insertar datos de ejemplo en la tabla:
BEGIN TRANSACTION; Insert Into systest.f_account_balance values (1,1,60); Insert Into systest.f_account_balance values (1,2,99); Insert Into systest.f_account_balance values (1,3,94); Insert Into systest.f_account_balance values (1,4,90); Insert Into systest.f_account_balance values (1,5,80); Insert Into systest.f_account_balance values (1,6,88); Insert Into systest.f_account_balance values (1,7,90); Insert Into systest.f_account_balance values (1,8,92); Insert Into systest.f_account_balance values (1,9,10); Insert Into systest.f_account_balance values (1,10,60); Insert Into systest.f_account_balance values (1,11,80); Insert Into systest.f_account_balance values (1,12,10); END TRANSACTION;
La tabla de muestra tiene los siguientes datos:
account_id | month_id | balance |
1 | 1 | 60 |
1 | 2 | 99 |
1 | 3 | 94 |
1 | 4 | 90 |
1 | 5 | 80 |
1 | 6 | 88 |
1 | 7 | 90 |
1 | 8 | 92 |
1 | 9 | 10 |
1 | 10 | 60 |
1 | 11 | 80 |
1 | 12 | 10 |
Para cada cuenta, digamos que desea analizar la secuencia de aumentos de saldo mensuales consecutivos. Cuando el saldo de un mes es inferior o igual al saldo del mes anterior, es necesario restablecer el contador a cero y reiniciarlo.
Caso de uso de Teradata RESET WHEN
Para analizar estos datos, Teradata SQL utiliza una función de ventana con un agregado anidado y una RESETWHENfrase, de la siguiente manera:
SELECT account_id, month_id, balance, ( ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY month_id RESET WHEN balance <= SUM(balance) over (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) ) -1 ) as balance_increase FROM systest.f_account_balance ORDER BY 1,2;
Salida:
account_id | month_id | balance | balance_increase |
1 | 1 | 60 | 0 |
1 | 2 | 99 | 1 |
1 | 3 | 94. | 0 |
1 | 4 | 90 | 0 |
1 | 5 | 80 | 0 |
1 | 6 | 88 | 1 |
1 | 7 | 90 | 2. |
1 | 8 | 92 | 3 |
1 | 9 | 10 | 0 |
1 | 10 | 60 | 1 |
1 | 11 | 80 | 2. |
1 | 12 | 10 | 0 |
La consulta se procesa de la siguiente manera en Teradata:
La función de agregado SUM(saldo) calcula la suma de todos los saldos de una cuenta determinada en un mes determinado.
Comprobamos si el saldo de un mes determinado (para una cuenta determinada) es superior al saldo del mes anterior.
Si el saldo aumentó, registramos un valor de recuento acumulado. Si la RESETWHENcondición se evalúa como falsa, lo que significa que el saldo ha aumentado durante meses sucesivos, seguiremos aumentando el recuento.
La función analítica ordenada ROW_ NUMBER () calcula el valor del recuento. Cuando llegamos a un mes cuyo saldo es inferior o igual al saldo del mes anterior, la RESETWHENcondición se evalúa como verdadera. Si es así, iniciamos una nueva partición y ROW_ NUMBER () reinicia el conteo desde 1. Usamos ROWSBETWEEN1 PRECEDING AND 1 PRECEDING para acceder al valor de la fila anterior.
Restamos 1 para asegurarnos de que el valor del recuento comience por 0.
Equivalente a Amazon Redshift SQL
Amazon Redshift no admite la RESETWHENfrase en una función de ventana SQL analítica. Para obtener el mismo resultado, debe reescribir Teradata con la SQL sintaxis nativa de Amazon SQL Redshift y las subconsultas anidadas, de la siguiente manera:
SELECT account_id, month_id, balance, (ROW_NUMBER() OVER(PARTITION BY account_id, new_dynamic_part ORDER BY month_id) -1) as balance_increase FROM ( SELECT account_id, month_id, balance, prev_balance, SUM(dynamic_part) OVER (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) As new_dynamic_part FROM ( SELECT account_id, month_id, balance, SUM(balance) over (PARTITION BY account_id ORDER BY month_id ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) as prev_balance, (CASE When balance <= prev_balance Then 1 Else 0 END) as dynamic_part FROM systest.f_account_balance ) A ) B ORDER BY 1,2;
Como Amazon Redshift no admite funciones de ventana anidadas en la SELECTcláusula de una sola SQL sentencia, debe utilizar dos subconsultas anidadas.
En la subconsulta interna (alias A), se crea y rellena un indicador de partición dinámica (dynamic_part). dynamic_part se establece en 1 si el saldo de un mes es inferior o igual al saldo del mes anterior; de lo contrario, se establece en 0.
En la siguiente capa (alias B), se genera un atributo new_dynamic_part como resultado de una función de ventana. SUM
Por último, añada new_dynamic_part como un nuevo atributo de partición (partición dinámica) al atributo de partición existente (account_id) y aplique la misma función de ventana ROW_ NUMBER () que en Teradata (y menos una).
Tras estos cambios, Amazon Redshift SQL genera la misma salida que Teradata.
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree su función de ventana de Teradata. | Utilice agregados anidados y la RESET WHEN frase según sus 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
RESETWHENPhrase
(documentación de Teradata) RESETWHENexplicación
(Stack Overflow) 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 función NORMALIZE temporal de Teradata en Amazon SQL Redshift AWS (Guía prescriptiva)
Herramientas
Socios