SnowConvert AI - Teradata - DML¶
このセクションでは、データ操作言語要素の変換リファレンスのドキュメントをご覧いただけます。
ステートメントの削除¶
ステートメントの削除 を見る
Teradataは FROM 句で複数のテーブルを呼び出すことをサポートしていますが、Snowflakeはサポートしていません。したがって、USING 句を使用して、条件に関係する余分なテーブルを参照する必要があります。
Teradata
削除
DEL FROM MY_TABLE ALL;
DEL FROM MY_TABLE_2 WHERE COL1 > 50;
DELETE T1 FROM TABLE1 T1, TABLE2 T2 WHERE T1.ID = T2.ID;
DELETE FROM TABLE1 T1, TABLE2 T2 WHERE T1.ID = T2.ID;
DELETE T1 FROM TABLE2 T2, TABLE1 T1 WHERE T1.ID = T2.ID;
DELETE FROM TABLE1 WHERE TABLE1.COLUMN1 = TABLE2.COLUMN2
Snowflake
削除
DELETE FROM
MY_TABLE;
DELETE FROM
MY_TABLE_2
WHERE
COL1 > 50;
DELETE FROM
TABLE1 T1
USING TABLE2 T2
WHERE
T1.ID = T2.ID;
DELETE FROM
TABLE1 T1
USING TABLE2 T2
WHERE
T1.ID = T2.ID;
DELETE FROM
TABLE1 T1
USING TABLE2 T2
WHERE
T1.ID = T2.ID;
DELETE FROM
TABLE1
WHERE
TABLE1.COLUMN1 = TABLE2.COLUMN2;
既知の問題¶
1.DEL 省略形がサポートされていません¶
省略形はSnowflakeではサポートされていませんが、 DELETE に変更することで正しく翻訳されます。
集合演算子¶
SQL 集合演算子は、複数のクエリの結果セットを操作し、各クエリの結果を1つの結果セットにまとめます。
注釈
わかりやすくするため、出力コードの一部を省略しています。
セット演算子 を参照してください。
TeradataとSnowflakeの両方のセット演算子は同じ構文で、 INTERSECT ALL の句 ALL を除いて、 EXCEPT、 INTERSECT、 UNION のシナリオをサポートしています。これはSnowflakeではサポートされていないため、変換後に ALL の部分がコメントされたコードになる結果となっています。
Teradata
Intersect¶
SELECT LastName, FirstName FROM employees
INTERSECT
SELECT FirstName, LastName FROM contractors;
SELECT LastName, FirstName FROM employees
INTERSECT ALL
SELECT FirstName, LastName FROM contractors;
Snowflake
Intersect¶
SELECT
LastName,
FirstName FROM
employees
INTERSECT
SELECT
FirstName,
LastName FROM
contractors;
SELECT
LastName,
FirstName FROM
employees
INTERSECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'INTERSECT ALL QUANTIFIER' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!! ALL
SELECT
FirstName,
LastName FROM
contractors;
既知の問題¶
1.INTERSECT ALL がサポートされていません¶
Snowflakeでは INTERSECT ALL はサポートされておらず、 ALL の部分がコメントされます。
関連 EWIs¶
SSC-EWI-0040:ステートメントがサポートされていません。
ステートメントの更新¶
説明¶
テーブルの既存の行の列値を変更します。 (Teradata SQL 言語リファレンス UPDATE)
サンプルソースパターン¶
基本ケース¶
Teradata
更新
UPDATE CRASHDUMPS.TABLE1 i
SET COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
AND i.COLUMN3 = 'L';
Snowflake
更新
UPDATE CRASHDUMPS.TABLE1 AS i
SET
i.COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
FROM
CRASHDUMPS.TABLE2
WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
AND UPPER(RTRIM( i.COLUMN3)) = UPPER(RTRIM('L'));
フォワードエイリアスを使用した UPDATE¶
Teradataは宣言前のエイリアスの参照をサポートしていますが、Snowflakeはサポートしていません。このシナリオの変換は、参照されるテーブルを取り出し、参照するテーブル名のエイリアスを変更することです。
Teradata
更新
UPDATE i
FROM CRASHDUMPS.TABLE2, CRASHDUMPS.TABLE1 i
SET COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
AND i.COLUMN3 = 'L';
Snowflake
更新
UPDATE CRASHDUMPS.TABLE1 AS i
SET
i.COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
FROM
CRASHDUMPS.TABLE2
WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
AND UPPER(RTRIM( i.COLUMN3)) = UPPER(RTRIM('L'));
FROM 句でのターゲットテーブルを指定した UPDATE¶
Teradataは、 FROM 句でターゲットテーブルを定義することをサポートしています。Snowflakeでは、エイリアスの重複や曖昧な列参照エラーを回避するために、これは削除されています。
Teradata
更新
UPDATE some_table
FROM some_table
SET Code = Code + 100
WHERE Name = 'A';
Snowflake
更新
UPDATE some_table
SET Code = Code + 100
WHERE
UPPER(RTRIM( Name)) = UPPER(RTRIM('A'));
関連 EWIs¶
関連 EWIs はありません。
修飾子付き¶
共通テーブル式( CTEs )とも呼ばれる複数の名前付きクエリのリストで WITH 修飾子を使用するSelectステートメント。
修飾子付き を見る
Snowflakeは、 CTEs (共通テーブル式)を複数持つ SELECT ステートメントで、Teradataの WITH 修飾子をサポートしています。Teradataは、 CTE の定義が宣言される前に参照されるかどうかに関係なく、どのような順序でもサポートしますが、Snowflakeでは、 CTE が別の CTE を呼び出す場合は、呼び出される前に定義する必要があります。次に、 WITH 内の変換された CTEs のシーケンスは、参照されていない CTEs、次に次の CTE を呼び出す CTE、というように並び替えられます。
WITH の呼び出しシーケンスにサイクルが検出された場合、 SSC-EWI-TD0077 の例に詳述されているように、シーケンスは変更されずに元のまま残されます。
以下の例では、n1とn2という2つの CTEs があり、n1はn2を参照しています。次に、Snowflakeではまずn2を対応する変換コードとして定義しなければなりません。
注釈
わかりやすくするため、出力コードの一部を省略しています。
Teradata
修飾子付き¶
WITH recursive n1(c1) as (select c1, c3 from t2, n1),
n2(c2) as (select c2 from tablex)
SELECT * FROM t1;
Snowflake
修飾子付き¶
WITH RECURSIVE n1(c1) AS
(
SELECT
c1,
c3 from
t2, n1
),
n2(c2) AS
(
SELECT
c2 from
tablex
)
SELECT
* FROM
t1;
既知の問題¶
1.サイクルが見つかった場合、並べ替えは不可能¶
CTEs の参照が分析され、 CTEs の呼び出しの間にサイクルがある場合、 CTEs は順序付けされません。
関連 EWIs¶
関連 EWIs はありません。
ステートメントの挿入¶
テーブルに新しい行を追加する SQL ステートメント。
注釈
わかりやすくするため、出力コードの一部を省略しています。
ステートメントの挿入 を見る
Teradataでは、各テーブル列の値をインラインで代入する代替 INSERT 構文があります。この代替構造をSnowflakeでサポートするには、特別な変換が必要です。値のインライン代入は、Snowflake INSERT INTO ステートメントの VALUES(...) 部分に分離して配置されます。
Teradata
挿入¶
INSERT INTO appDB.logTable (
process_name = 'S2F_BOOKS_LOAD_NEW'
, session_id = 105678989
, message_txt = ''
, message_ts = '2019-07-23 00:00:00'
, Insert_dt = CAST((CURRENT_TIMESTAMP(0)) AS DATE FORMAT 'YYYY-MM-DD'));
Snowflake
挿入¶
INSERT INTO appDB.logTable (
process_name, session_id, message_txt, message_ts, Insert_dt)
VALUES ('S2F_BOOKS_LOAD_NEW', 105678989, '', '2019-07-23 00:00:00', TO_DATE((CURRENT_TIMESTAMP(0))));
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
LOGGING ERRORS¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
注釈
関連性のないステートメント。
警告
このステートメントは関連性のない構文であるため、 移行から削除される ことに注意してください。つまり、Snowflakeでは必要ないということです。
説明¶
ステートメントを INSERT...SELECT として使用する際にエラーをログに記録するステートメント。以下の ドキュメント を参照してください。
サンプルソースパターン¶
LOGGING ERRORS¶
この例では、 LOGGING ERRORS は関係ない構文なので削除されていることに注意してください。構文はSnowflakeでは必須ではありません。
Teradata¶
INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
LOGGING ALL ERRORS¶
この例では、 LOGGING ALL ERRORS は関係ない構文なので削除されていることに注意してください。構文はSnowflakeでは必須ではありません。
Teradata¶
INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ALL ERRORS;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
LOGGING ERRORS WITH NO LIMIT¶
この例では、 LOGGING ERRORS WITH NO LIMIT は関係ない構文なので削除されていることに注意してください。構文はSnowflakeでは必須ではありません。
Teradata¶
INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS WITH NO LIMIT;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
LOGGING ERRORS WITH LIMIT OF¶
この例では、 LOGGING ERRORS WITH LIMIT OF は関係ない構文なので削除されていることに注意してください。構文はSnowflakeでは必須ではありません。
Teradata¶
INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS WITH LIMIT OF 100;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
ステートメントを選択¶
ステートメントを選択 を見る
Snowflakeは、いくつかの例外を除き、Teradataの SELECT 構文をサポートしています。主に、 SEL の省略形をサポートしていません。
Teradata
Sel
SEL DISTINCT col1, col2 FROM table1
Snowflake
Select
SELECT DISTINCT col1,
col2 FROM
table1;
Teradataは宣言前のエイリアスの参照をサポートしていますが、Snowflakeはサポートしていません。このシナリオの変換は、参照される列を取り出し、その列が参照する列名のエイリアスを変更することです。
Teradata
エイリアス
SELECT
my_val, sum(col1),
col2 AS my_val FROM table1
Snowflake
エイリアス
SELECT
my_val,
SUM(col1),
col2 AS my_val FROM
table1;
削除された句オプション¶
以下の句オプションはSnowflakeには関係ないため、移行時に削除されます。
Teradata |
Snowflake |
|---|---|
拡大 |
サポート対象外 |
ノーマライズ |
サポート対象外 |
チェックオプション付き(クエリ) |
サポート対象外 |
既知の問題¶
1.SEL 省略形がサポートされていません¶
省略形はSnowflakeではサポートされていませんが、 SELECT に変更することで正しく翻訳されます。
関連 EWIs¶
関連 EWIs はありません。
ANY 述語¶
警告
これは進行中の作業であり、将来的に変更が加えられる可能性があります。
説明¶
Teradataでは、比較演算または IN/NOT IN 述語で定量化が可能です。式とサブクエリが返す値のセット内の少なくとも1つの値の比較が真です。詳細情報については、以下の Teradataドキュメント を参照してください。
Teradata構文
{ expression quantifier ( literal [ {, | OR} ... ] ) |
{ expression | ( expression [,...] ) } quantifier ( subquery )
}
Where量指定子:
{ comparison_operator [ NOT ] IN } { ALL |ANY | SOME }
Snowflake構文
SuccessPlaceholder
サブクエリ形式では、 IN は = ANY と等価であり、 NOT IN は <> ALL と等価です。詳細については、以下の Snowflakeドキュメント を参照してください。
個々の値を比較するには、
<value> [ NOT ] IN ( <value_1> [ , <value_2> ... ] )
row constructors (括弧で括られた値のリスト)を比較するには、
( <value_A> [, <value_B> ... ] ) [ NOT ] IN ( ( <value_1> [ , <value_2> ... ] ) [ , ( <value_3> [ , <value_4> ... ] ) ... ] )
値をサブクエリによって返される値と比較するには、
<value> [ NOT ] IN ( <subquery> )
サンプルソースパターン¶
サンプルデータ¶
Teradata¶
クエリ¶
CREATE TABLE Employee (
EmpNo INT,
Name VARCHAR(100),
DeptNo INT
);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (1, 'Alice', 100);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (2, 'Bob', 300);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (3, 'Charlie', 500);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (4, 'David', 200);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (5, 'Eve', 100);
Snowflake¶
クエリ¶
CREATE OR REPLACE TABLE Employee (
EmpNo INT,
Name VARCHAR(100),
DeptNo INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "01/14/2025", "domain": "test" }}'
;
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (1, 'Alice', 100);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (2, 'Bob', 300);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (3, 'Charlie', 500);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (4, 'David', 200);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (5, 'Eve', 100);
WHERE 句内の等しい ANY 述語 ¶
Teradata
入力¶
SELECT DeptNo
FROM Employee
WHERE DeptNo = ANY(100,300,500) ;
出力¶
DeptNo |
|---|
100 |
500 |
100 |
300 |
Snowflake
入力¶
SELECT DeptNo
FROM Employee
WHERE DeptNo IN(100,300,500) ;
出力¶
DeptNo |
|---|
100 |
500 |
100 |
300 |
WHERE 句の他の比較演算子¶
他の比較演算子がある場合、同等の変換は、必要なロジックを持つサブクエリを追加することです。
Teradata
入力¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo < ANY(100,300,500) ;
出力¶
名前 |
DeptNo |
|---|---|
イブ |
100 |
アリス |
100 |
デイビッド |
200 |
ボブ |
300 |
Snowflake
入力¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo < ANY
(SELECT DeptNo
FROM Employee
WHERE DeptNo > 100
OR DeptNo > 300
OR DeptNo > 500);
出力¶
NAME |
DEPTNO |
|---|---|
アリス |
100 |
イブ |
100 |
ボブ |
300 |
デイビッド |
200 |
WHERE 句内の IN ANY¶
Teradata
入力¶
SELECT DeptNo
FROM Employee
WHERE DeptNo IN ANY(100,300,500) ;
出力¶
DeptNo |
|---|
100 |
500 |
100 |
300 |
Snowflake
入力¶
SELECT DeptNo
FROM Employee
WHERE DeptNo IN(100,300,500) ;
出力¶
DeptNo |
|---|
100 |
500 |
100 |
300 |
WHERE 句内の NOT IN ALL¶
Teradata
入力¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN ALL(100, 200);
出力¶
名前 |
DeptNo |
|---|---|
チャーリー |
500 |
ボブ |
300 |
Snowflake
入力¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN (100, 200);
出力¶
名前 |
DeptNo |
|---|---|
チャーリー |
500 |
ボブ |
300 |
既知の問題¶
WHERE 句内の NOT IN ANY¶
Teradata
入力¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN ANY(100, 200);
出力¶
名前 |
DeptNo |
|---|---|
イブ |
100 |
チャーリー |
500 |
アリス |
100 |
デイビッド |
200 |
ボブ |
300 |
Snowflake
入力¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo IN (100, 200)
OR DeptNo NOT IN (100, 200);
出力¶
名前 |
DeptNo |
|---|---|
イブ |
100 |
チャーリー |
500 |
アリス |
100 |
デイビッド |
200 |
ボブ |
300 |
関連 EWIs¶
関連 EWIs はありません。
Expand On句¶
Teradata Expand On機能をSnowflakeに変換するための翻訳リファレンス
説明¶
Expand On句は、 期間 データ型を持つ列を拡大し、入力行の期間値に基づいて行の規則的な時系列を作成します。Expand On句の詳細情報については、 Teradataドキュメント を参照してください。
サンプルソースパターン¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
サンプルデータ¶
Teradata¶
CREATE TABLE table1 (id INTEGER, pd PERIOD (TIMESTAMP));
INSERT INTO
table1
VALUES
(
1,
PERIOD(
TIMESTAMP '2022-05-23 10:15:20.00009',
TIMESTAMP '2022-05-23 10:15:25.000012'
)
);
Snowflake¶
CREATE OR REPLACE TABLE table1 (
id INTEGER,
pd VARCHAR(58) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO table1
VALUES (
1, PUBLIC.PERIOD_UDF(
TIMESTAMP '2022-05-23 10:15:20.00009',
TIMESTAMP '2022-05-23 10:15:25.000012'
) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
Expand On句¶
期間列を秒単位で拡大するとします。このExpand On句には、アンカー期間拡大と間隔リテラル拡大があります。
アンカー期間拡大¶
Teradata¶
SELECT
id,
BEGIN(bg)
FROM
table1 EXPAND ON pd AS bg BY ANCHOR ANCHOR_SECOND;
結果¶
ID |
BEGIN (bg) |
|---|---|
1 |
2022-05-23 10:15:21.0000 |
1 |
2022-05-23 10:15:22.0000 |
1 |
2022-05-23 10:15:23.0000 |
1 |
2022-05-23 10:15:24.0000 |
1 |
2022-05-23 10:15:25.0000 |
SnowflakeはExpand On句をサポートしていません。同じ結果と機能を再現するために、Teradataの SQL コードは CTE ブロックに含まれ、 EXPAND_ON_UDF および TABLE 関数を使用し、 FLATTEN 関数を使用して複数行を返し、 ROW_COUNT_UDF および DIFF_TTIME_PERIOD_UDF を使用して必要な行数を示し、 VALUE を返して、EXPAND_ON_UDF が異なる定期的な時系列を計算できるようにします。この CTE ブロックはExpand On句と同じexpand列エイリアスを返すので、期間データ型のどのような使用法でも結果を使用できます。
Snowflake¶
WITH ExpandOnCTE AS
(
SELECT
PUBLIC.EXPAND_ON_UDF('ANCHOR_SECOND', VALUE, pd) bg
FROM
table1,
TABLE(FLATTEN(PUBLIC.ROW_COUNT_UDF(PUBLIC.DIFF_TIME_PERIOD_UDF('ANCHOR_SECOND', pd))))
)
SELECT
id,
PUBLIC.PERIOD_BEGIN_UDF(bg) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
FROM
table1,
ExpandOnCTE;
結果¶
ID |
PERIOD_BEGIN_UDF(bg) |
|---|---|
1 |
2022-05-23 10:15:21.0000 |
1 |
2022-05-23 10:15:22.0000 |
1 |
2022-05-23 10:15:23.0000 |
1 |
2022-05-23 10:15:24.0000 |
1 |
2022-05-23 10:15:25.0000 |
既知の問題¶
Expand On句は、間隔リテラル拡大を使用することができます。この場合、 SnowConvert AI は、この翻訳が計画されているというエラーを追加します。
間隔リテラル拡大¶
Teradata¶
SELECT
id,
BEGIN(bg)
FROM
table1 EXPAND ON pd AS bg BY INTERVAL '1' SECOND;
結果¶
ID |
BEGIN(bg) |
|---|---|
1 |
2022-05-23 10:15:20.0000 |
1 |
2022-05-23 10:15:21.0000 |
1 |
2022-05-23 10:15:22.0000 |
1 |
2022-05-23 10:15:23.0000 |
1 |
2022-05-23 10:15:24.0000 |
Snowflake¶
SELECT
id,
PUBLIC.PERIOD_BEGIN_UDF(bg) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
FROM
table1
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'EXPAND ON' NODE ***/!!!
EXPAND ON pd AS bg BY INTERVAL '1' SECOND;
関連 EWIs¶
SSC-EWI-0073: 機能等価性レビュー保留中。
SSC-EWI-TD0053:Snowflakeはperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます。
ノーマライズ¶
Teradata Normalize機能をSnowflakeに変換するための翻訳リファレンス
説明¶
NORMALIZE は、最初の期間の列の期間値が一致または重複する場合、個々の期間値を包含する期間を形成するために結合されることを指定します。Normalize句の詳細情報については、 Teradataドキュメント を参照してください。
サンプルソースパターン¶
注釈
わかりやすくするため、出力コードの一部を省略しています。
サンプルデータ¶
Teradata¶
CREATE TABLE project (
emp_id INTEGER,
project_name VARCHAR(20),
dept_id INTEGER,
duration PERIOD(DATE)
);
INSERT INTO project
VALUES
(
10,
'First Phase',
1000,
PERIOD(DATE '2010-01-10', DATE '2010-03-20')
);
INSERT INTO project
VALUES
(
10,
'First Phase',
2000,
PERIOD(DATE '2010-03-20', DATE '2010-07-15')
);
INSERT INTO project
VALUES
(
10,
'Second Phase',
2000,
PERIOD(DATE '2010-06-15', DATE '2010-08-18')
);
INSERT INTO project
VALUES
(
20,
'First Phase',
2000,
PERIOD(DATE '2010-03-10', DATE '2010-07-20')
);
INSERT INTO project
VALUES
(
20,
'Second Phase',
1000,
PERIOD(DATE '2020-05-10', DATE '2020-09-20')
);
Snowflake¶
CREATE OR REPLACE TABLE project (
emp_id INTEGER,
project_name VARCHAR(20),
dept_id INTEGER,
duration VARCHAR(24) !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO project
VALUES (
10,
'First Phase',
1000, PUBLIC.PERIOD_UDF(DATE '2010-01-10', DATE '2010-03-20') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
INSERT INTO project
VALUES (
10,
'First Phase',
2000, PUBLIC.PERIOD_UDF(DATE '2010-03-20', DATE '2010-07-15') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
INSERT INTO project
VALUES (
10,
'Second Phase',
2000, PUBLIC.PERIOD_UDF(DATE '2010-06-15', DATE '2010-08-18') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
INSERT INTO project
VALUES (
20,
'First Phase',
2000, PUBLIC.PERIOD_UDF(DATE '2010-03-10', DATE '2010-07-20') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
INSERT INTO project
VALUES (
20,
'Second Phase',
1000, PUBLIC.PERIOD_UDF(DATE '2020-05-10', DATE '2020-09-20') !!!RESOLVE EWI!!! /*** SSC-EWI-TD0053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/!!!);
Normalize句¶
Normalize句を従業員IDで使用したいとします。
Teradata¶
SELECT
NORMALIZE emp_id,
duration
FROM
project;
結果¶
EMP_ID |
DURATION |
|---|---|
20 |
(2010-03-10, 2010-07-20) |
10 |
(2010-01-10, 2010-08-18) |
20 |
(2020-05-10, 2010-09-20) |
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0079 - THE REQUIRED PERIOD TYPE COLUMN WAS NOT FOUND ***/!!!
WITH NormalizeCTE AS
(
SELECT
T1.*,
SUM(GroupStartFlag)
OVER (
PARTITION BY
emp_id, duration
ORDER BY
PeriodColumn_begin
ROWS UNBOUNDED PRECEDING) GroupID
FROM
(
SELECT
emp_id,
duration,
PUBLIC.PERIOD_BEGIN_UDF(PeriodColumn) PeriodColumn_begin,
PUBLIC.PERIOD_END_UDF(PeriodColumn) PeriodColumn_end,
(CASE
WHEN PeriodColumn_begin <= LAG(PeriodColumn_end)
OVER (
PARTITION BY
emp_id, duration
ORDER BY
PeriodColumn_begin,
PeriodColumn_end)
THEN 0
ELSE 1
END) GroupStartFlag
FROM
project
) T1
)
SELECT
emp_id,
duration,
PUBLIC.PERIOD_UDF(MIN(PeriodColumn_begin), MAX(PeriodColumn_end))
FROM
NormalizeCTE
GROUP BY
emp_id,
duration,
GroupID;
結果¶
EMP_ID |
PUBLIC.PERIOD_UDF(MIN(START_DATE), MAX(END_DATE)) |
|---|---|
20 |
2020-05-10*2010-09-20 |
20 |
2010-03-10*2010-07-20 |
10 |
2010-01-10*2010-08-18 |
既知の問題¶
Normalize句には、** ON MEETS OR OVERLAPS 、 ON OVERLAPS または ON OVERLAPS OR MEETS **を使用することができます。これらの場合、 SnowConvert AI は、この翻訳が将来予定されているというエラーを追加します。
Teradata¶
SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration FROM table1;
Snowflake¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'NORMALIZE SET QUANTIFIER' NODE ***/!!!
NORMALIZE ON MEETS OR OVERLAPS emp_id,
duration FROM
table1;
関連 EWIs¶
SSC-EWI-0073: 機能等価性レビュー保留中。
SSC-EWI-TD0079:必要なPeriod型列が見つかりませんでした。
SSC-EWI-TD0053:Snowflakeはperiodデータ型をサポートしておらず、すべてのperiodはvarcharとして処理されます。
Reset When¶
説明¶
Reset Whenは、 SQL ウィンドウ関数が動作するパーティションを、特定の条件に基づいて決定します。条件がTrueに評価されると、既存のウィンドウパーティション内に新しい動的サブパーティションが作成されます。Reset Whenの詳細情報については、 Teradataドキュメントを参照してください。
サンプルソースパターン¶
サンプルデータ¶
Teradata¶
クエリ
CREATE TABLE account_balance
(
account_id INTEGER NOT NULL,
month_id INTEGER,
balance INTEGER
)
UNIQUE PRIMARY INDEX (account_id, month_id);
INSERT INTO account_balance VALUES (1, 1, 60);
INSERT INTO account_balance VALUES (1, 2, 99);
INSERT INTO account_balance VALUES (1, 3, 94);
INSERT INTO account_balance VALUES (1, 4, 90);
INSERT INTO account_balance VALUES (1, 5, 80);
INSERT INTO account_balance VALUES (1, 6, 88);
INSERT INTO account_balance VALUES (1, 7, 90);
INSERT INTO account_balance VALUES (1, 8, 92);
INSERT INTO account_balance VALUES (1, 9, 10);
INSERT INTO account_balance VALUES (1, 10, 60);
INSERT INTO account_balance VALUES (1, 11, 80);
INSERT INTO account_balance VALUES (1, 12, 10);
結果
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 |
Snowflake¶
クエリ
CREATE OR REPLACE TABLE account_balance (
account_id INTEGER NOT NULL,
month_id INTEGER,
balance INTEGER,
UNIQUE (account_id, month_id)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
;
INSERT INTO account_balance
VALUES (1, 1, 60);
INSERT INTO account_balance
VALUES (1, 2, 99);
INSERT INTO account_balance
VALUES (1, 3, 94);
INSERT INTO account_balance
VALUES (1, 4, 90);
INSERT INTO account_balance
VALUES (1, 5, 80);
INSERT INTO account_balance
VALUES (1, 6, 88);
INSERT INTO account_balance
VALUES (1, 7, 90);
INSERT INTO account_balance
VALUES (1, 8, 92);
INSERT INTO account_balance
VALUES (1, 9, 10);
INSERT INTO account_balance
VALUES (1, 10, 60);
INSERT INTO account_balance
VALUES (1, 11, 80);
INSERT INTO account_balance
VALUES (1, 12, 10);
結果
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 |
Reset When¶
各アカウントについて、毎月の連続した残高増加のシーケンスを分析したいとします。ある月の残高が前月の残高以下である場合、カウンターをゼロにリセットし、再スタートする必要があります。
このデータを分析するために、Teradata SQL は以下のように、ネストされた集計とReset Whenステートメントを持つウィンドウ関数を使用します。
Teradata¶
クエリ
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 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 |
Snowflake¶
Snowflakeはウィンドウ関数のReset When句をサポートしていません。同じ結果を再現するには、Teradata 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,
previous_value,
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 previous_value,
(CASE
WHEN balance <= previous_value
THEN 1
ELSE 0
END) AS dynamic_part
FROM
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 |
SnowflakeのReset When機能をサポートするには、2つのネストされたサブクエリが必要です。
内部サブクエリでは、動的パーティションインディケータ(dynamic_part)が作成され、入力されます。ある月の残高が前月の残高以下の場合、dynamic_partは1にセットされ、それ以外の場合、0にセットされます。
次のレイヤーでは、 SUM ウィンドウ関数の結果として、new_dynamic_part属性が生成されます。
最後に、既存のパーティション属性(account_id)に新しいパーティション属性(動的パーティション)としてnew_dynamic_partを追加し、Teradataと同じ ROW_NUMBER()ウィンドウ関数を適用します。
これらの変更後、SnowflakeはTeradataと同じ出力を生成します。
条件付きウィンドウ関数が列の場合のReset When¶
RESET WHEN 条件で使用されるウィンドウ関数が、 previous という列として定義されていることを除けば、上記と同じ例です。このバリエーションでは、前の例のように previous_value を定義する必要がなくなるため、変換がわずかに変わります。それは同じ回避策です。
Teradata¶
クエリ
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 previous,
(
ROW_NUMBER() OVER (
PARTITION BY account_id
ORDER BY
month_id RESET WHEN balance <= previous
)
) AS balance_increase
FROM account_balance
ORDER BY 1, 2;
結果
| account_id | month_id | balance | previous | balance_increase |
|---|---|---|---|---|
| 1 | 1 | 60 | 0 | |
| 1 | 2 | 99 | 60 | 1 |
| 1 | 3 | 94 | 99 | 0 |
| 1 | 4 | 90 | 94 | 0 |
| 1 | 5 | 80 | 90 | 0 |
| 1 | 6 | 88 | 80 | 1 |
| 1 | 7 | 90 | 88 | 2 |
| 1 | 8 | 92 | 90 | 3 |
| 1 | 9 | 10 | 92 | 0 |
| 1 | 10 | 60 | 10 | 1 |
| 1 | 11 | 80 | 60 | 2 |
| 1 | 12 | 10 | 80 | 0 |
Snowflake¶
クエリ
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 previous,
(
ROW_NUMBER() OVER (
PARTITION BY
account_id, new_dynamic_part
ORDER BY
month_id
)
) AS balance_increase
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 previous,
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 previous,
(CASE
WHEN balance <= previous
THEN 1
ELSE 0
END) AS dynamic_part
FROM
account_balance
)
)
ORDER BY 1, 2;
無題
| account_id | month_id | balance | previous | balance_increase |
|---|---|---|---|---|
| 1 | 1 | 60 | 0 | |
| 1 | 2 | 99 | 60 | 1 |
| 1 | 3 | 94 | 99 | 0 |
| 1 | 4 | 90 | 94 | 0 |
| 1 | 5 | 80 | 90 | 0 |
| 1 | 6 | 88 | 80 | 1 |
| 1 | 7 | 90 | 88 | 2 |
| 1 | 8 | 92 | 90 | 3 |
| 1 | 9 | 10 | 92 | 0 |
| 1 | 10 | 60 | 10 | 1 |
| 1 | 11 | 80 | 60 | 2 |
| 1 | 12 | 10 | 80 | 0 |
既知の問題¶
RESET WHEN 句には、その条件などいくつかのバリエーションがあります。現在、 SnowConvert AI はバイナリ条件( <=, >=、<>または=)のみをサポートしています。 IS NOT NULL のように他の型では、 SnowConvert AI は RESET WHEN 句を削除し、次の例に示すように、Snowflakeではサポートされていないため、エラーメッセージを追加します。
Teradata¶
クエリ
SELECT
account_id,
month_id,
balance,
ROW_NUMBER() OVER (
PARTITION BY account_id
ORDER BY month_id
RESET WHEN balance IS NOT NULL
ROWS UNBOUNDED PRECEDING
) as balance_increase
FROM account_balance
ORDER BY 1,2;
Snowflake¶
クエリ
SELECT
account_id,
month_id,
balance,
ROW_NUMBER() OVER (
PARTITION BY account_id
!!!RESOLVE EWI!!! /*** SSC-EWI-TD0077 - RESET WHEN CLAUSE IS NOT SUPPORTED IN THIS SCENARIO DUE TO ITS CONDITION ***/!!!
ORDER BY month_id
ROWS UNBOUNDED PRECEDING
) as balance_increase
FROM
account_balance
ORDER BY 1,2;
関連 EWIs¶
SSC-EWI-TD0077: RESET WHEN 句はその条件のため、このシナリオではサポートされていません。
SAMPLE 句¶
説明¶
Teradataの SAMPLE 句は、処理する行数を減らし、1つ以上の行のサンプルを端数のリストまたは行数のリストとして返します。この句は SELECT クエリで使用されます。詳細情報については、以下の Teradataドキュメント を参照してください。
Teradata構文
SAMPLE
[ WITH REPLACEMENT ]
[ RANDOMIZED LOCALIZATION ]
{ { fraction_description | count_description } [,...] |
when_clause ]
}
Snowflake構文
詳細情報については、以下の Snowflakeドキュメント を参照してください。SAMPLE と TABLESAMPLE は同義です。
SELECT ...
FROM ...
{ SAMPLE | TABLESAMPLE } [ samplingMethod ]
[ ... ]
条件:
samplingMethod ::= {
{ BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) |
{ SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
Snowflakeでは、以下のキーワードは互換性があります。
SAMPLE | TABLESAMPLEBERNOULLI | ROWSYSTEM | BLOCKREPEATABLE | SEED
以下のテーブルでキーの違いを確認してください。
SAMPLE 動作 |
Teradata |
Snowflake |
|---|---|---|
確率によるサンプル |
分数の説明としても知られています。0,1から1の間の小数でなければなりません。 |
0から100までの小数点。 |
固定行数 |
カウントの説明としても知られています。サンプリングする行数を決める正の整数です。 |
テーブルからサンプルする行数(最大1,000,000)を指定します。 |
繰り返し行 |
これは |
|
サンプリング方法 |
Proportional および |
|
サンプルソースパターン¶
サンプルデータ¶
Teradata¶
クエリ
CREATE TABLE Employee (
EmpNo INT,
Name VARCHAR(100),
DeptNo INT
);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (1, 'Alice', 100);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (2, 'Bob', 300);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (3, 'Charlie', 500);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (4, 'David', 200);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (5, 'Eve', 100);
Snowflake¶
クエリ
CREATE OR REPLACE TABLE Employee (
EmpNo INT,
Name VARCHAR(100),
DeptNo INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "01/14/2025", "domain": "test" }}'
;
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (1, 'Alice', 100);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (2, 'Bob', 300);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (3, 'Charlie', 500);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (4, 'David', 200);
INSERT INTO Employee (EmpNo, Name, DeptNo)
VALUES (5, 'Eve', 100);
SAMPLE 句¶
固定行数¶
この例では、行数は一定ですが、各実行で同じ結果になるとは限らないことに注意してください。
Teradata
入力
SELECT * FROM Employee SAMPLE 2;
出力 2行。
Snowflake
入力
SELECT * FROM Employee SAMPLE (2 ROWS);
出力 2行。
確率に基づく行数¶
このオプションは、確率セットに応じてさまざまな行を返します。
Teradata
入力
SELECT * FROM Employee SAMPLE 0.25;
出力 各行の25%の確率:出力1行。
Snowflake
入力
SELECT * FROM Employee SAMPLE (25);
出力 各行の25%の確率:出力1行。
既知の問題¶
置換による固定行数¶
このオプションは固定行数を返し、行の繰り返しを許可します。Snowflakeでは、テーブルの行数以上のサンプルをリクエストすることはできません。
Teradataサンプル
入力
SELECT * FROM Employee SAMPLE WITH REPLACEMENT 8;
出力
EmpNo |
名前 |
DeptNo |
|---|---|---|
5 |
イブ |
100 |
5 |
イブ |
100 |
5 |
イブ |
100 |
4 |
デイビッド |
200 |
4 |
デイビッド |
200 |
3 |
チャーリー |
500 |
1 |
アリス |
100 |
1 |
アリス |
100 |
条件付きサンプリング¶
Snowflakeには条件付きサンプリングはありません。これは CTE を使用することで実現できます。
Teradataサンプル
入力
SELECT * FROM employee
SAMPLE WHEN DeptNo > 100 then 0.9
ELSE 0.1 END;
出力
EmpNo |
名前 |
DeptNo |
|---|---|---|
3 |
チャーリー |
500 |
4 |
デイビッド |
200 |
2 |
ボブ |
300 |
関連 EWIs¶
SSC-EWI-0021:構文はSnowflakeではサポートされていません。