

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Teradata RESET WHEN 特徴量を Amazon Redshift SQL に変換
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql"></a>

*Po Hong (Amazon Web Services)*

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

**RESET WHEN** は、SQL 分析ウィンドウ関数で使用されるテラデータの特徴量です。それは ANSI SQL 標準の拡張です。**RESET WHEN** は、特定の条件に基づいてSQL ウィンドウ関数が動作するパーティションを決定します。条件が **TRUE**と評価されると、既存のウィンドウパーティションの中に新しい動的サブパーティションが作成されます。**RESET WHEN**の詳細については、[「テラデータのドキュメント」](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg)を参照してください。

Amazon Redshift は SQL ウィンドウ関数で **RESET WHEN** をサポートしていません。この機能を実装するには、 **RESET WHEN** を Amazon Redshift でネイティブ SQL 構文に変換し、複数の入れ子関数を使用する必要があります。このパターンは、Teradata **RESET WHEN** 特徴量を使用する方法と、 Amazon Redshift SQL 構文に変換する方法を示しています。 

## 前提条件と制限
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-prereqs"></a>

**前提条件**
+ Teradata のデータウェアハウスとその SQL 構文の基本的な知識
+ Amazon Redshift とその SQL 構文の十分な理解

## アーキテクチャ
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-architecture"></a>

**ソーステクノロジースタック**
+ Teradataデータウェアハウス

**ターゲットテクノロジースタック**
+ Amazon Redshift

**アーキテクチャ**

Teradataデータベースを Amazon Redshift に移行するための高レベルのアーキテクチャについては、「[AWS SCT データ抽出エージェントを使用して、 Teradataのデータベースを Amazon Redshift に移行する](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html)」というパターンを参照してください。移行しても、Teradata **RESET WHEN** フレーズは Amazon Redshift SQL に自動的に変換されません。このTeradata拡張は、次のセクションのガイドラインに従って変換できます。

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

**Code**

**RESET WHEN** の概念を説明するには、テラデータにおける以下のテーブル定義を考慮します:

```
create table systest.f_account_balance                                
( account_id integer NOT NULL,
  month_id integer,
  balance integer )
unique primary index (account_id, month_id);
```

次の SQL コードを実行して、サンプルデータをテーブルに挿入します：

```
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;
```

このサンプルテーブルには、次のデータがあります：


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

アカウントごとに、連続的な月次残高の増加のシーケンスを分析したいものとします。ある月の残高が前月の残高以下の場合、必要なことはカウンターをゼロにリセットして再起動します。

*Teradata RESET WHENのユースケース*

このデータを分析するためにTeradata SQL は、ネストされた集計ウィンドウ関数と **RESET WHEN** フレーズを次のように使用します:

```
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;
```

出力:


| 
| 
|  account\_id | month\_id | balance | balance\_increase | 
| --- |--- |--- |--- |
| 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 | 

Teradataにクエリが次のように処理されます:

1. **SUM (残高)**集計関数は、特定の口座の特定の月のすべての残高の合計を計算します。

1. 特定の月の（特定の口座の）残高が前月残高を超えているかどうかを確認します。

1. 残高が増加した場合、累積のカウント値を追跡します。**RESET WHEN** の条件が**false** と評価された場合、つまり、残高が連続する月について増加した場合、引き続きカウントを増加します。

1. **ROW\_NUMBER ()**で順序付けされた分析関数がカウントの値を計算します。残高が前月の残高以下になると、**RESET WHEN** 条件で **true** と評価します。その場合、新しいパーティションを開始し、**ROW\_NUMBER ()**でカウントを 1 から再開します。**ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING**を使用して、前の行の値にアクセスします。

1. 1 を差し引くことで、カウント値が 必ず0 から始まるようにします。

*Amazon Redshift と同等の SQL*

SQL 分析ウィンドウ関数の **RESET WHEN** フレーズに Amazon Redshift が適用されません。 同じ結果を生むために、 Amazon Redshift ネイティブ SQL 構文とネストされたサブクエリを使用して、テラデータの SQL を次のように書き直す必要があります: 

```
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;
```

単一の SQL ステートメントの**SELECT** 句にネストされたウィンドウ関数に、Amazon Redshift が適用されないため、2つのネストされたサブクエリを使用する必要があります。
+ 内部サブクエリ (エイリアス A ) では、動的パーティションインジケータ (**dynamic\_part**) が作成され、入力されます。ある月の残高が前月残高の以下の場合、 **dynamic\_part** が 1 に設定され、それ以外の場合は 0 に設定されます。 
+ 次のレイヤー (エイリアス B ) では、**new\_dynamic\_part** 属性が、**SUM **ウィンドウ関数の結果として、生成されます。 
+ 最後に、新しいパーティション属性 (**動的パーティション**) として、**new\_dynamic\_part** を既存のパーティション属性 (**account\_id**) に追加します。さらに、同じ **ROW\_NUMBER()** ウィンドウ関数を Teradata に適用します (1 を差し引く)。 

このように変更すると、Amazon Redshift SQL が Teradata と同じ出力を生成します。

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

### RESET WHEN を Amazon Redshift SQL に変換
<a name="convert-reset-when-to-amazon-redshift-sql"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Teradataのウィンドウ関数を作成します。 | 必要に応じて、ネストされた集計と RESET WHEN フレーズを使用します。 | SQL Developer | 
| コードを Amazon Redshift SQL に変換します。 | コードを変換するには、このパターンの「ツール」セクションのガイドラインに従います。 | SQL Developer | 
| Amazon Redshift でコードを実行します。 | テーブルを作成し、テーブルにデータをロードして、Amazon Redshift でコードを実行します。 | SQL Developer | 

## 関連リソース
<a name="convert-the-teradata-reset-when-feature-to-amazon-redshift-sql-resources"></a>

**リファレンス**
+ 「[RESET WHEN フレーズ](https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg)」（Teradataのドキュメント）
+ 「[RESET WHEN の説明](https://stackoverflow.com/questions/53344536/teradata-reset-when-partition-by-order-by)」（スタックオーバーフロー）
+ 「[Amazon Redshiftに移行](https://aws.amazon.com/redshift/data-warehouse-migration/)」（AWS ウェブサイト）
+ 「[AWS SCT データ抽出エージェントを使用して、Teradataデータベースを Amazon Redshift に移行する](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-teradata-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.html)」(AWS 規範ガイダンス)
+ 「[Teradata NORMALIZE 時間的特徴量を Amazon Redshift SQL に変換](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.html)」(AWS 規範ガイダンス)

**ツール**
+ 「[AWS Schema Conversion Tool (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/)」

**パートナー**
+ 「[AWS 移行コンピテンシーパートナー](https://aws.amazon.com/migration/partner-solutions/#delivery)」