

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Convertir la fonctionnalité Teradata RESET WHEN en Amazon Redshift SQL
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql"></a>

*Po Hong, Amazon Web Services*

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

**RESET WHEN** est une fonctionnalité Teradata utilisée dans les fonctions des fenêtres analytiques SQL. Il s'agit d'une extension de la norme ANSI SQL. **RESET WHEN** détermine la partition sur laquelle une fonction de fenêtre SQL fonctionne en fonction d'une condition spécifiée. Si la condition est définie sur **VRAI**, une nouvelle sous-partition dynamique est créée à l'intérieur de la partition de fenêtre existante. Pour plus d'informations sur **RESET WHEN**, consultez la [documentation Teradata](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg).

Amazon Redshift ne prend pas en charge les fonctions **RESET WHEN** dans les fenêtres SQL. Pour implémenter cette fonctionnalité, vous devez convertir **RESET WHEN** en syntaxe SQL native dans Amazon Redshift et utiliser plusieurs fonctions imbriquées. Ce modèle montre comment utiliser la fonctionnalité Teradata **RESET WHEN** et comment la convertir en syntaxe SQL Amazon Redshift. 

## Conditions préalables et limitations
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-prereqs"></a>

**Conditions préalables**
+ Connaissances de base de l'entrepôt de données Teradata et de sa syntaxe SQL
+ Bonne compréhension d'Amazon Redshift et de sa syntaxe SQL

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

**Pile technologique source**
+ Entrepôt de données Teradata

**Pile technologique cible**
+ Amazon Redshift

**Architecture**

Pour une architecture de haut niveau permettant de migrer une base de données Teradata vers Amazon Redshift, consultez le [modèle Migrer une base de données Teradata vers Amazon Redshift à l'aide des agents d'extraction de données 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 migration ne convertit pas automatiquement la phrase Teradata **RESET WHEN** en Amazon Redshift SQL. Vous pouvez convertir cette extension Teradata en suivant les instructions de la section suivante.

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

**Code**

Pour illustrer le concept de **RESET WHEN**, considérez la définition de table suivante dans Teradata :

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

Exécutez le code SQL suivant pour insérer des exemples de données dans la table :

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

Le tableau d'exemple contient les données suivantes :


| 
| 
| account\_id | ID du mois | 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 | 

Pour chaque compte, supposons que vous souhaitiez analyser la séquence des augmentations mensuelles consécutives du solde. Lorsque le solde d'un mois est inférieur ou égal au solde du mois précédent, il est nécessaire de remettre le compteur à zéro et de redémarrer.

*Cas d'utilisation de Teradata RESET WHEN*

Pour analyser ces données, Teradata SQL utilise une fonction de fenêtre avec un agrégat imbriqué et une phrase **RESET WHEN**, comme suit :

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

Sortie :


| 
| 
|  account\_id | ID du mois | balance | augmentation du solde | 
| --- |--- |--- |--- |
| 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 requête est traitée comme suit dans Teradata :

1. La fonction d'agrégation **SUM (balance)** calcule la somme de tous les soldes d'un compte donné au cours d'un mois donné.

1. Nous vérifions si le solde d'un mois donné (pour un compte donné) est supérieur au solde du mois précédent.

1. Si le solde augmente, nous suivons une valeur de comptage cumulée. Si la condition **RESET WHEN** prend la valeur **fausse**, ce qui signifie que le solde a augmenté au fil des mois, nous continuons à augmenter le nombre.

1. La fonction analytique ordonnée **ROW\_NUMBER ()** calcule la valeur du comptage. Lorsque nous atteignons un mois dont le solde est inférieur ou égal au solde du mois précédent, la condition **RESET WHEN** devient **vraie**. Si c'est le cas, nous démarrons une nouvelle partition et **ROW\_NUMBER () recommence** le décompte à partir de 1. Nous utilisons **les lignes comprises entre 1 précédent et 1 précédent** pour accéder à la valeur de la ligne précédente.

1. Nous soustrayons 1 pour nous assurer que la valeur du comptage commence par 0.

*SQL équivalent à Amazon Redshift*

Amazon Redshift ne prend pas en charge la phrase **RESET WHEN** dans une fonction de fenêtre d'analyse SQL.  Pour obtenir le même résultat, vous devez réécrire le code SQL Teradata à l'aide de la syntaxe SQL native d'Amazon Redshift et de sous-requêtes imbriquées, comme suit : 

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

Amazon Redshift ne prenant pas en charge les fonctions de fenêtre imbriquées dans la clause **SELECT** d'une seule instruction SQL, vous devez utiliser deux sous-requêtes imbriquées.
+ Dans la sous-requête interne (alias A), un indicateur de partition dynamique (**dynamic\_part**) est créé et renseigné. **dynamic\_part** est défini sur 1 si le solde d'un mois est inférieur ou égal au solde du mois précédent ; dans le cas contraire, il est défini sur 0. 
+ **Dans la couche suivante (alias B), un attribut **new\_dynamic\_part** est généré à la suite d'une fonction de fenêtre SUM.** 
+ Enfin, vous ajoutez **new\_dynamic\_part** en tant que nouvel attribut de partition (partition **dynamique) à l'attribut de partition** existant (**account\_id) et vous appliquez la même fonction de fenêtre ROW\_NUMBER** **() que dans Teradata (avec moins un)**. 

Après ces modifications, Amazon Redshift SQL génère le même résultat que Teradata.

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

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


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez votre fonction de fenêtre Teradata. | Utilisez des agrégats imbriqués et la phrase RESET WHEN selon vos besoins. | SQL Developer | 
| Convertissez le code en Amazon Redshift SQL. | Pour convertir votre code, suivez les instructions de la section « Outils » de ce modèle. | SQL Developer | 
| Exécutez le code dans Amazon Redshift. | Créez votre table, chargez des données dans la table et exécutez votre code dans Amazon Redshift. | SQL Developer | 

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

**Références**
+ [Phrase RÉINITIALISER QUAND](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg) (documentation Teradata)
+ [Explication « RÉINITIALISER QUAND](https://stackoverflow.com/questions/53344536/teradata-reset-when-partition-by-order-by) » (Stack Overflow)
+ [Migrer vers Amazon Redshift (site](https://aws.amazon.com/redshift/data-warehouse-migration/) Web AWS)
+ [Migrer une base de données Teradata vers Amazon Redshift à l'aide des agents d'extraction de données 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) (AWS Prescriptive Guidance)
+ [Convertir la fonctionnalité temporelle Teradata NORMALIZE en Amazon Redshift](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.html) SQL (AWS Prescriptive Guidance)

**Outils**
+ [Outil de conversion de schéma AWS (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)

**Partenaires**
+ [AWS Migration Competency Partners](https://aws.amazon.com/migration/partner-solutions/#delivery)