Konvertieren Sie die RESET WHEN Teradata-Funktion zu Amazon Redshift SQL - AWS Prescriptive Guidance

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:

  1. Die Aggregatfunktion SUM(Saldo) berechnet die Summe aller Salden für ein bestimmtes Konto in einem bestimmten Monat.

  2. Wir prüfen, ob ein Saldo in einem bestimmten Monat (für ein bestimmtes Konto) höher ist als der Saldo des Vormonats.

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

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

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

AufgabeBeschreibungErforderliche 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

Referenzen

Tools

Partner