Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Konvertieren Sie die RESET WHEN Teradata-Funktion zu Amazon Redshift SQL
Erstellt von Po Hong () AWS
Quelle: Teradata Data Warehouse | Ziel: Amazon Redshift | R-Typ: Re-Architect |
Umgebung: Produktion | Technologien: Analytik; Datenbanken; Migration | Arbeitslast: Alle anderen Workloads |
AWSDienste: Amazon Redshift |
Übersicht
RESETWHENist eine Teradata-Funktion, die in SQL analytischen Fensterfunktionen verwendet wird. Es ist eine Erweiterung des ANSI SQL Standards. RESETWHENbestimmt die Partition, über die eine SQL Fensterfunktion ausgeführt wird, basierend auf einer bestimmten Bedingung. Ergibt die Bedingung den Wert TRUE, wird innerhalb der vorhandenen Fensterpartition eine neue, dynamische Unterpartition erstellt. Weitere Informationen zu RESETWHENfinden Sie in der Teradata-Dokumentation
Amazon Redshift unterstützt keine RESETWHENSQLIn-Fenster-Funktionen. Um diese Funktionalität zu implementieren, müssen Sie in die native SQL Syntax in Amazon Redshift konvertieren RESETWHENund mehrere verschachtelte Funktionen verwenden. Dieses Muster zeigt, wie Sie die RESETWHENTeradata-Funktion verwenden und sie in die Amazon Redshift SQL Redshift-Syntax konvertieren können.
Voraussetzungen und Einschränkungen
Voraussetzungen
Grundkenntnisse des Teradata Data Warehouse und seiner Syntax SQL
Gutes Verständnis von Amazon Redshift und seiner Syntax SQL
Architektur
Quelltechnologie-Stack
Teradata-Datawarehouse
Zieltechnologie-Stack
Amazon-Redshift
Architektur
Eine übergeordnete Architektur für die Migration einer Teradata-Datenbank zu Amazon Redshift finden Sie im Muster Migrieren einer Teradata-Datenbank zu Amazon Redshift mithilfe von Datenextraktionsagenten. AWS SCT Die Migration konvertiert die RESETWHENTeradata-Phrase nicht automatisch in Amazon Redshift. SQL Sie können diese Teradata-Erweiterung konvertieren, indem Sie die Richtlinien im nächsten Abschnitt befolgen.
Tools
Code
Sehen Sie sich zur Veranschaulichung des RESETWHENKonzepts die folgende Tabellendefinition in Teradata an:
create table systest.f_account_balance ( account_id integer NOT NULL, month_id integer, balance integer ) unique primary index (account_id, month_id);
Führen Sie den folgenden SQL Code aus, um Beispieldaten in die Tabelle einzufügen:
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;
Die Beispieltabelle enthält die folgenden Daten:
account_id | month_id | Saldo |
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 |
Nehmen wir an, Sie möchten für jedes Konto die Reihenfolge der aufeinanderfolgenden monatlichen Saldoerhöhungen analysieren. Wenn der Saldo eines Monats kleiner oder gleich dem Saldo des Vormonats ist, müssen Sie den Zähler auf Null zurücksetzen und neu starten.
Anwendungsfall Teradata RESET WHEN
Um diese Daten zu analysieren, SQL verwendet Teradata eine Fensterfunktion mit einem verschachtelten Aggregat und einer RESETWHENPhrase wie folgt:
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;
Ausgabe:
account_id | month_id | Saldo | gleichgewicht_erhöhen |
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 |
Die Abfrage wird in Teradata wie folgt verarbeitet:
Die Aggregatfunktion SUM(Saldo) berechnet die Summe aller Salden für ein bestimmtes Konto in einem bestimmten Monat.
Wir prüfen, ob ein Saldo in einem bestimmten Monat (für ein bestimmtes Konto) höher ist als der Saldo des Vormonats.
Wenn der Saldo gestiegen ist, erfassen wir einen kumulierten Zählwert. Wenn die RESETWHENBedingung als falsch bewertet wird, was bedeutet, dass der Saldo in aufeinanderfolgenden Monaten gestiegen ist, erhöhen wir die Anzahl weiter.
Die geordnete analytische Funktion ROW_ NUMBER () berechnet den Zählwert. Wenn wir einen Monat erreichen, dessen Saldo kleiner oder gleich dem Saldo des Vormonats ist, wird die RESETWHENBedingung als wahr gewertet. Falls ja, starten wir eine neue Partition und ROW_ NUMBER () startet die Zählung bei 1. Wir verwenden ROWSBETWEEN1 PRECEDING AND 1 PRECEDING, um auf den Wert der vorherigen Zeile zuzugreifen.
Wir subtrahieren 1, um sicherzustellen, dass der Zählwert mit 0 beginnt.
Amazon Redshift Redshift-Äquivalent SQL
Amazon Redshift unterstützt den RESETWHENAusdruck in einer SQL analytischen Fensterfunktion nicht. Um dasselbe Ergebnis zu erzielen, müssen Sie die Teradata SQL mit der nativen Amazon Redshift SQL Redshift-Syntax und verschachtelten Unterabfragen wie folgt neu schreiben:
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;
Da Amazon Redshift keine Funktionen für verschachtelte Fenster in der SELECTKlausel einer einzelnen SQL Anweisung unterstützt, müssen Sie zwei verschachtelte Unterabfragen verwenden.
In der inneren Unterabfrage (Alias A) wird ein dynamischer Partitionsindikator (dynamic_part) erstellt und gefüllt. dynamic_part wird auf 1 gesetzt, wenn der Saldo eines Monats kleiner oder gleich dem Saldo des Vormonats ist. Andernfalls wird er auf 0 gesetzt.
In der nächsten Ebene (Alias B) wird ein new_dynamic_part-Attribut als Ergebnis einer Fensterfunktion generiert. SUM
Schließlich fügen Sie new_dynamic_part als neues Partitionsattribut (dynamische Partition) zum vorhandenen Partitionsattribut (account_id) hinzu und wenden dieselbe Fensterfunktion ROW_ () wie in Teradata an NUMBER (und minus eins).
Nach diesen Änderungen SQL generiert Amazon Redshift dieselbe Ausgabe wie Teradata.
Epen
Aufgabe | Beschreibung | Erforderliche Fähigkeiten |
---|---|---|
Erstellen Sie Ihre Teradata-Fensterfunktion. | Verwenden Sie verschachtelte Aggregate und die RESET WHEN Phrase entsprechend Ihren Bedürfnissen. | SQLEntwickler |
Konvertieren Sie den Code in Amazon RedshiftSQL. | Folgen Sie den Richtlinien im Abschnitt „Tools“ dieses Musters, um Ihren Code zu konvertieren. | SQLEntwickler |
Führen Sie den Code in Amazon Redshift aus. | Erstellen Sie Ihre Tabelle, laden Sie Daten in die Tabelle und führen Sie Ihren Code in Amazon Redshift aus. | SQLEntwickler |
Zugehörige Ressourcen
Referenzen
RESETWHENPhrase
(Teradata-Dokumentation) RESETWHENErklärung
(Stack Overflow) Zu Amazon Redshift migrieren
(AWSWebsite) Migrieren Sie eine Teradata-Datenbank mithilfe von AWS SCT Datenextraktionsagenten zu Amazon Redshift (AWSPrescriptive Guidance)
Die NORMALIZE Temporalfunktion von Teradata auf Amazon Redshift umstellen SQL (AWSPrescriptive Guidance)
Tools
Partner