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 :
La fonction d'agrégation SUM(solde) calcule la somme de tous les soldes d'un compte donné au cours d'un mois donné.
Nous vérifions si le solde d'un mois donné (pour un compte donné) est supérieur au solde du mois précédent.
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.
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.
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âche | Description | Compé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 |
Ressources connexes
Références
RESETWHENPhrase
(documentation Teradata) RESETWHENexplication
(Stack Overflow) Migrer une base de données Teradata vers Amazon Redshift à AWS SCT l'aide d'agents d'extraction de données AWS (directives prescriptives)
Convertir la fonctionnalité NORMALIZE temporelle Teradata en Amazon SQL Redshift AWS (directives prescriptives)
Outils
Partenaires