

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Converter o atributo Teradata RESET WHEN para Amazon Redshift SQL
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql"></a>

*Po Hong, Amazon Web Services*

## Resumo
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-summary"></a>

**RESET WHEN** é um atributo do Teradata usado nas funções de janela analítica do SQL. É uma extensão do padrão ANSI SQL. **RESET WHEN** determina a partição na qual uma função de janela SQL opera com base em alguma condição especificada. Se a condição for avaliada como **TRUE**, uma nova subpartição dinâmica será criada dentro da partição da janela existente. Para obter mais informações sobre **RESET WHEN**, consulte a [Documentação do Teradata](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg).

O Amazon Redshift não oferece suporte para **RESET WHEN** em funções de janela SQL. Para implementar essa funcionalidade, você precisa converter **RESET WHEN** para a sintaxe SQL nativa no Amazon Redshift e usar várias funções aninhadas. Esse padrão demonstra como você pode usar o atributo do Teradata **RESET WHEN** e como convertê-lo para a sintaxe SQL do Amazon Redshift. 

## Pré-requisitos e limitações
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-prereqs"></a>

**Pré-requisitos **
+ Conhecimento básico do data warehouse Teradata e sua sintaxe SQL
+ Bom entendimento do Amazon Redshift e de sua sintaxe SQL

## Arquitetura
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-architecture"></a>

**Pilha de tecnologia de origem**
+ Data warehouse Teradata

**Pilha de tecnologias de destino**
+ banco de dados de origem

**Arquitetura**

Para obter uma arquitetura de alto nível para migrar um banco de dados Teradata para o Amazon Redshift, consulte o padrão [Migrar um banco de dados Teradata para o Amazon Redshift usando agentes de extração de dados do AWS SCT](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html). A migração não converte automaticamente a frase **RESET WHEN** do Teradata em SQL do Amazon Redshift. Você pode converter essa extensão do Teradata seguindo as diretrizes na próxima seção.

## Ferramentas
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-tools"></a>

**Código **

Para ilustrar o conceito e a funcionalidade do **RESET WHEN**, considere a seguinte definição de tabela no Teradata:

```
create table systest.f_account_balance                                
( account_id integer NOT NULL,
  month_id integer,
  balance integer )
unique primary index (account_id, month_id);
```

Execute o código SQL a seguir para inserir dados de exemplo na tabela:

```
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;
```

A tabela de amostra tem os seguintes dados:


| 
| 
| 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 conta, suponhamos que você queira analisar a sequência de aumentos de saldo mensais consecutivos. Quando o saldo de um mês for menor ou igual ao saldo do mês anterior, o requisito é zerar o contador e reiniciá-lo.

*Caso de uso do RESET WHEN do Teradata*

Para analisar esses dados, o Teradata SQL usa uma função de janela com um agregado aninhado e uma frase **RESET WHEN**, da seguinte forma:

```
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;
```

Saída:


| 
| 
|  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 | 

A consulta é processada da seguinte forma no Teradata:

1. A função agregada **SUM (balance)** calcula a soma de todos os saldos de uma determinada conta em um determinado mês.

1. Verificamos se o saldo em um determinado mês (para uma determinada conta) é maior que o saldo do mês anterior.

1. Se o saldo aumentar, rastreamos um valor de contagem cumulativa. Se a condição **RESET WHEN** avalia como **falsa**, o que significa que o saldo aumentou em meses sucessivos, a contagem continua aumentando.

1. A função analítica ordenada **ROW\_NUMBER ()** calcula o valor da contagem. Quando atingimos um mês cujo saldo é menor ou igual ao saldo do mês anterior, a condição **RESET WHEN** é avaliada como **verdadeira**. Nesse caso, iniciamos uma nova partição e **ROW\_NUMBER ()** reinicia a contagem a partir de 1. Usamos **LINHAS ENTRE 1 ANTERIOR E 1 ANTERIOR** para acessar o valor da linha anterior.

1. Subtraímos 1 para garantir que o valor da contagem comece com 0.

*SQL equivalente ao Amazon Redshift*

O Amazon Redshift não oferece suporte para **RESET WHEN** em uma função de janela SQL analítica.  Para produzir o mesmo resultado, você deve reescrever o SQL Teradata usando a sintaxe SQL nativa do Amazon Redshift e subconsultas aninhadas, da seguinte forma: 

```
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 o Amazon Redshift não oferece suporte a funções de janela aninhadas na cláusula **SELECT** de uma única instrução SQL, você deve usar duas subconsultas aninhadas.
+ Na subconsulta interna (alias A), um indicador de partição dinâmica (**dynamic\_part**) é criado e preenchido. O **dynamic\_part** é definido como 1 se o saldo de um mês for menor ou igual ao saldo do mês anterior; caso contrário, será definido como 0. 
+ Na próxima camada (alias B), um atributo **new\_dynamic\_part** é gerado como resultado de uma função de janela **SUM**. 
+ Por fim, você adiciona **new\_dynamic\_part** como um novo atributo de partição (**partição dinâmica**) ao atributo de partição existente (**account\_id**) e aplica a mesma função de janela **ROW\_NUMBER()** usada no Teradata (subtraindo um). 

Depois dessas alterações, o Amazon Redshift SQL gera a mesma saída que o Teradata.

## Épicos
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-epics"></a>

### Converter o RESET WHEN para Amazon Redshift SQL
<a name="convert-reset-when-to-amazon-redshift-sql"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Criar sua função de janela Teradata. | Use agregados aninhados e a frase RESET WHEN de acordo com as suas necessidades. | SQL Developer | 
| Converter o código para Amazon Redshift SQL. | Para converter seu código, siga as diretrizes na seção “Ferramentas” desse padrão. | SQL Developer | 
| Executar o código no Amazon Redshift. | Crie sua tabela, carregue dados na tabela e execute seu código no Amazon Redshift. | SQL Developer | 

## Recursos relacionados
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-resources"></a>

**Referências**
+ [Frase RESET WHEN](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg) (documentação da Teradata)
+ [Explicação do RESET WHEN](https://stackoverflow.com/questions/53344536/teradata-reset-when-partition-by-order-by) (estouro de pilha)
+ [Migre para o Amazon Redshift](https://aws.amazon.com/redshift/data-warehouse-migration/) (site da AWS)
+ [Migre um banco de dados Teradata para o Amazon Redshift usando agentes de extração de dados do AWS SCT](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html) (Recomendações da AWS)
+ [Converta o atributo temporal Teradata NORMALIZE no Amazon Redshift SQL](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.html) (Recomendações da AWS)

**Ferramentas**
+ [AWS Schema Conversion Tool (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)

**Parceiros**
+ [Parceiros de competência em migração da AWS](https://aws.amazon.com/migration/partner-solutions/#delivery)