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)
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 :
La fonction d'agrégation SUM (balance) 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 condition RESET WHEN prend la valeur 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 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.
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â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
Références
Phrase RÉINITIALISER QUAND
(documentation Teradata) Explication « RÉINITIALISER QUAND
» (Stack Overflow) Migrer vers Amazon Redshift (site
Web AWS) Migrer une base de données Teradata vers Amazon Redshift à l'aide des agents d'extraction de données AWS SCT (AWS Prescriptive Guidance)
Convertir la fonctionnalité temporelle Teradata NORMALIZE en Amazon Redshift SQL (AWS Prescriptive Guidance)
Outils
Partenaires