

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Convertire la funzionalità Teradata RESET WHEN in Amazon Redshift SQL
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql"></a>

*Po Hong, Amazon Web Services*

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

**RESET WHEN** è una funzionalità di Teradata utilizzata nelle funzioni analitiche delle finestre SQL. È un'estensione dello standard ANSI SQL. **RESET** WHEN determina la partizione su cui opera una funzione di finestra SQL in base a una condizione specificata. Se la condizione restituisce **TRUE**, viene creata una nuova sottopartizione dinamica all'interno della partizione di finestra esistente. [Per ulteriori informazioni su **RESET WHEN, consultate la documentazione** di Teradata.](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg)

Amazon Redshift non supporta **RESET WHEN nelle funzioni** delle finestre SQL. Per implementare questa funzionalità, devi convertire **RESET WHEN** nella sintassi SQL nativa in Amazon Redshift e utilizzare più funzioni annidate. Questo modello dimostra come utilizzare la funzionalità Teradata **RESET WHEN** e come convertirla nella sintassi SQL di Amazon Redshift. 

## Prerequisiti e limitazioni
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-prereqs"></a>

**Prerequisiti**
+ Conoscenza di base del data warehouse Teradata e della sua sintassi SQL
+ Buona conoscenza di Amazon Redshift e della sua sintassi SQL

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

**Stack tecnologico di origine**
+ Data warehouse Teradata

**Stack tecnologico Target**
+ Amazon Redshift

**Architettura**

Per un'architettura di alto livello per la migrazione di un database Teradata ad Amazon Redshift, consulta lo schema [Migrare un database Teradata su Amazon Redshift utilizzando gli agenti di estrazione dati 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). La migrazione non converte automaticamente la frase Teradata **RESET WHEN** in Amazon Redshift SQL. Puoi convertire questa estensione Teradata seguendo le linee guida nella sezione successiva.

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

**Codice**

Per illustrare il concetto di **RESET WHEN, si** consideri la seguente definizione di tabella in Teradata:

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

Esegui il seguente codice SQL per inserire dati di esempio nella tabella:

```
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 tabella di esempio contiene i seguenti dati:


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

Per ogni account, supponiamo che tu voglia analizzare la sequenza di aumenti mensili consecutivi del saldo. Quando il saldo di un mese è inferiore o uguale al saldo del mese precedente, è necessario azzerare il contatore e riavviare il sistema.

*Caso d'uso Teradata RESET WHEN*

Per analizzare questi dati, Teradata SQL utilizza una funzione finestra con un aggregato annidato e una frase **RESET** WHEN, come segue:

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

Output:


| 
| 
|  account\_id | id\_mese | 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 query viene elaborata come segue in Teradata:

1. La funzione di aggregazione **SUM (saldo)** calcola la somma di tutti i saldi di un determinato conto in un determinato mese.

1. Controlliamo se un saldo in un determinato mese (per un determinato account) è maggiore del saldo del mese precedente.

1. Se il saldo aumenta, tracciamo un valore di conteggio cumulativo. Se la condizione **RESET** WHEN risulta **falsa**, il che significa che il saldo è aumentato nei mesi successivi, continuiamo ad aumentare il conteggio.

1. La funzione analitica ordinata **ROW\_NUMBER ()** calcola il valore del conteggio. **Quando raggiungiamo un mese il cui saldo è inferiore o uguale al saldo del mese precedente, la condizione **RESET WHEN** risulta vera.** In tal caso, iniziamo una nuova partizione e **ROW\_NUMBER ()** riavvia il conteggio da 1. Utilizziamo **ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING** per accedere al valore della riga precedente.

1. Sottraiamo 1 per assicurarci che il valore del conteggio inizi con 0.

*SQL equivalente ad Amazon Redshift*

Amazon Redshift non supporta la frase **RESET** WHEN in una funzione di finestra analitica SQL.  Per ottenere lo stesso risultato, è necessario riscrivere Teradata SQL utilizzando la sintassi SQL nativa di Amazon Redshift e sottoquery annidate, come segue: 

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

Poiché Amazon Redshift non supporta le funzioni di finestra annidata nella clausola **SELECT** di una singola istruzione SQL, è necessario utilizzare due sottoquery annidate.
+ **Nella sottoquery interna (alias A), viene creato e popolato un indicatore di partizione dinamica (dynamic\_part).** **dynamic\_part** è impostato su 1 se il saldo di un mese è inferiore o uguale al saldo del mese precedente; in caso contrario, è impostato su 0. 
+ **Nel livello successivo (alias B), viene generato un attributo **new\_dynamic\_part** come risultato di una funzione della finestra SUM.** 
+ **Infine, aggiungete **new\_dynamic\_part** come nuovo attributo di partizione (partizione **dinamica**) all'attributo di partizione esistente (**account\_id) e applicate la stessa funzione di finestra ROW\_NUMBER** () di Teradata (e meno una).** 

Dopo queste modifiche, Amazon Redshift SQL genera lo stesso output di Teradata.

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

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


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea la tua funzione di finestra Teradata. | Usa gli aggregati annidati e la frase RESET WHEN in base alle tue esigenze. | SQL Developer | 
| Converti il codice in Amazon Redshift SQL. | Per convertire il codice, segui le linee guida nella sezione «Strumenti» di questo modello. | SQL Developer | 
| Esegui il codice in Amazon Redshift. | Crea la tua tabella, carica i dati nella tabella ed esegui il codice in Amazon Redshift. | SQL Developer | 

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

**Riferimenti**
+ [RESET WHEN Phrase](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg) (documentazione Teradata)
+ [Spiegazione RESET WHEN](https://stackoverflow.com/questions/53344536/teradata-reset-when-partition-by-order-by) (Stack Overflow)
+ Esegui [la migrazione ad Amazon Redshift](https://aws.amazon.com/redshift/data-warehouse-migration/) (sito web AWS)
+ Esegui la [migrazione di un database Teradata su Amazon Redshift utilizzando agenti di estrazione dati AWS SCT (AWS Prescriptive Guidance](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html))
+ [Conversione della funzionalità temporale Teradata NORMALIZE in Amazon Redshift SQL (AWS Prescriptive Guidance](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.html))

**Strumenti**
+ [Strumento di conversione dello schema AWS (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)

**Partner**
+ [Partner AWS con competenze per la migrazione](https://aws.amazon.com/migration/partner-solutions/#delivery)