Convertir la RESET WHEN fonctionnalité Teradata 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 RESET WHEN fonctionnalité Teradata 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

AWSservices : Amazon Redshift

Récapitulatif

RESETWHENest une fonctionnalité Teradata utilisée dans les fonctions de fenêtre SQL d'analyse. Il s'agit d'une extension de la ANSI SQL norme. RESETWHENdétermine la partition sur laquelle une fonction de SQL fenêtre fonctionne en fonction d'une condition spécifiée. Si la condition est évaluée à TRUE, une nouvelle sous-partition dynamique est créée à l'intérieur de la partition de fenêtre existante. Pour plus d'informations à ce sujet RESETWHEN, consultez la documentation Teradata.

Amazon Redshift ne prend pas RESETWHENen charge les fonctions dans les SQL fenêtres. Pour implémenter cette fonctionnalité, vous devez passer RESETWHENà la SQL syntaxe native d'Amazon Redshift et utiliser plusieurs fonctions imbriquées. Ce modèle montre comment utiliser la RESETWHENfonctionnalité Teradata et comment la convertir en syntaxe Amazon SQL 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 d'agents d'extraction de données. AWS SCT La migration ne convertit pas automatiquement la RESETWHENphrase Teradata en Amazon SQL Redshift. Vous pouvez convertir cette extension Teradata en suivant les instructions de la section suivante.

Outils

Code

Pour illustrer le concept de RESETWHEN, 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 SQL code suivant pour insérer des exemples de données dans le tableau :

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'RESETWHENutilisation de Teradata

Pour analyser ces données, Teradata SQL utilise une fonction de fenêtre avec un agrégat imbriqué et une RESETWHENphrase, 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(solde) 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 RESETWHENcondition est 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 RESETWHENcondition 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 ROWSBETWEEN1 PRECEDING AND 1 PRECEDING 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.

L'équivalent d'Amazon Redshift SQL

Amazon Redshift ne prend pas en charge RESETWHENcette expression dans une fonction de fenêtre d'SQLanalyse.  Pour obtenir le même résultat, vous devez réécrire les Teradata à l'SQLaide 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 SELECTclause d'une seule SQL instruction, 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 RESET WHEN phrase en fonction de vos besoins.

SQLdéveloppeur
Convertissez le code en Amazon RedshiftSQL.

Pour convertir votre code, suivez les instructions de la section « Outils » de ce modèle.

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

SQLdéveloppeur

Références

Outils

Partenaires