Convertir la fonctionnalité Teradata RESET WHEN en Amazon Redshift SQL - Recommandations AWS

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

Créée par Po Hong (AWS)

Source : Entrepôt de données Teradata

Cible : Amazon Redshift

Type R : Ré-architecte

Environnement : Production

Technologies : analyse ; bases de données ; migration

Charge de travail : toutes les autres charges de travail

Services AWS : Amazon Redshift

Récapitulatif

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.

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

Prérequis

  • 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

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

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

équilibre

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

équilibre

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 USD

1

10

60

1

1

11

80

2

1

12

10

0 USD

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

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

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

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

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

TâcheDescriptionCompé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

Références

Outils

Partenaires