

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 Teradata RESET WHEN-Funktion in Amazon Redshift SQL
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql"></a>

*Po Hong, Amazon Web Services*

## Zusammenfassung
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-summary"></a>

**RESET WHEN** ist eine Teradata-Funktion, die in analytischen Fensterfunktionen von SQL verwendet wird. Es ist eine Erweiterung des ANSI SQL-Standards. **RESET WHEN** bestimmt die Partition, über die eine SQL-Fensterfunktion ausgeführt wird, basierend auf einer bestimmten Bedingung. Wenn die Bedingung **TRUE** ergibt, wird eine neue, dynamische Unterpartition innerhalb der vorhandenen Fensterpartition erstellt. Weitere Informationen zu **RESET** WHEN finden Sie in der [Teradata-Dokumentation](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg).

Amazon Redshift unterstützt **RESET WHEN** in SQL-Fensterfunktionen nicht. Um diese Funktionalität zu implementieren, müssen Sie **RESET WHEN** in die native SQL-Syntax in Amazon Redshift konvertieren und mehrere verschachtelte Funktionen verwenden. Dieses Muster zeigt, wie Sie die Teradata **RESET** WHEN-Funktion verwenden und sie in die Amazon Redshift SQL-Syntax konvertieren können. 

## Voraussetzungen und Einschränkungen
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-prereqs"></a>

**Voraussetzungen**
+ Grundkenntnisse des Teradata Data Warehouse und seiner SQL-Syntax
+ Gutes Verständnis von Amazon Redshift und seiner SQL-Syntax

## Architektur
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-architecture"></a>

**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 AWS SCT-Datenextraktionsagenten](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html). Die Migration konvertiert die Teradata **RESET** WHEN-Phrase nicht automatisch in Amazon Redshift SQL. Sie können diese Teradata-Erweiterung konvertieren, indem Sie die Richtlinien im nächsten Abschnitt befolgen.

## Tools
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-tools"></a>

**Code**

Sehen Sie sich die folgende Tabellendefinition in Teradata an, um das Konzept von **RESET WHEN** zu veranschaulichen:

```
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 | balance | 
| --- |--- |--- |
| 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, verwendet Teradata SQL eine Fensterfunktion mit einem verschachtelten Aggregat und einer **RESET WHEN-Phrase 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 | balance | Saldo 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.

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

1. Wenn der Saldo gestiegen ist, erfassen wir einen kumulierten Zählwert. Wenn die Bedingung **RESET WHEN als** **falsch** ausgewertet wird, was bedeutet, dass der Saldo in aufeinanderfolgenden Monaten gestiegen ist, erhöhen wir die Anzahl weiter.

1. 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 **RESET WHEN-Bedingung als wahr** ausgewertet.** Falls ja, starten wir eine neue Partition und **ROW\_NUMBER ()** setzt die Zählung bei 1 neu an. Wir verwenden **ROWS BETWEEN 1 PREVIODING UND 1 PREVIODING, um auf den Wert der vorherigen** Zeile zuzugreifen.

1. Wir subtrahieren 1, um sicherzustellen, dass der Zählwert mit 0 beginnt.

*Amazon Redshift Redshift-äquivalentes SQL*

Amazon Redshift unterstützt die **RESET WHEN-Phrase** in einer SQL-Analysefensterfunktion nicht.  Um dasselbe Ergebnis zu erzielen, müssen Sie Teradata SQL mithilfe der nativen SQL-Syntax von Amazon Redshift 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 **SELECT-Klausel** 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 SUM-Fensterfunktion generiert.** 
+ Schließlich fügen Sie **new\_dynamic\_part** als neues Partitionsattribut (**dynamische** Partition) zum vorhandenen Partitionsattribut (**account\_id) hinzu und wenden dieselbe Fensterfunktion **ROW\_NUMBER**** () wie in Teradata an (und minus eins). 

Nach diesen Änderungen generiert Amazon Redshift SQL dieselbe Ausgabe wie Teradata.

## Epen
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-epics"></a>

### RESET WHEN nach Amazon Redshift SQL konvertieren
<a name="convert-reset-when-to-amazon-redshift-sql"></a>


| Aufgabe | Description | Erforderliche Fähigkeiten | 
| --- | --- | --- | 
| Erstellen Sie Ihre Teradata-Fensterfunktion. | Verwenden Sie je nach Bedarf verschachtelte Aggregate und die RESET WHEN-Phrase. | SQL Developer | 
| Konvertieren Sie den Code in Amazon Redshift SQL. | Folgen Sie den Richtlinien im Abschnitt „Tools“ dieses Musters, um Ihren Code zu konvertieren. | SQL Developer | 
| 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. | SQL Developer | 

## Zugehörige Ressourcen
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-resources"></a>

**Referenzen**
+ [RESET WHEN-Phrase](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg) (Teradata-Dokumentation)
+ [Erklärung „RESET WHEN](https://stackoverflow.com/questions/53344536/teradata-reset-when-partition-by-order-by)“ (Stack Overflow)
+ [Migrieren Sie zu Amazon Redshift](https://aws.amazon.com/redshift/data-warehouse-migration/) (AWS-Website)
+ [Migrieren Sie eine Teradata-Datenbank mithilfe von AWS SCT-Datenextraktionsagenten zu Amazon Redshift (AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html) Prescriptive Guidance)
+ [Konvertieren Sie die temporale Funktion Teradata NORMALIZE in Amazon Redshift SQL](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.html) (AWS Prescriptive Guidance)

**Tools**
+ [AWS-Schemakonvertierungstool (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)

**Partner**
+ [AWS-Kompetenzpartner für Migration](https://aws.amazon.com/migration/partner-solutions/#delivery)