SnowConvert: Teradata DML-Anweisungen

DELETE-Anweisung

Siehe DELETE-Anweisung

Teradata unterstützt den Aufruf von mehr als einer Tabelle in der FROM-Klausel, Snowflake nicht. Daher ist es notwendig, die USING-Klausel zu verwenden, um auf die zusätzlichen Tabellen zu verweisen, die an der Bedingung beteiligt sind.

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
Copy

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

Bekannte Probleme

1. DEL abbreviation unsupported

Die Abkürzung wird in Snowflake nicht unterstützt, aber sie wird korrekt übersetzt, wenn sie in DELETE geändert wird.

Mengenoperatoren

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Siehe Mengenoperatoren

Mengenoperatoren haben sowohl in Teradata als auch in Snowflake die gleiche Syntax und unterstützen die Szenarien EXCEPT, INTERSECT und UNION mit Ausnahme der Klausel ALL in INTERSECT ALL, die in Snowflake nicht unterstützt wird, was dazu führt, dass der Teil des ALL nach der Konvertierung als kommentierter Code erscheint.

Teradata

 SELECT LastName, FirstName FROM employees
INTERSECT
SELECT FirstName, LastName FROM contractors;

SELECT LastName, FirstName FROM employees
INTERSECT ALL
SELECT FirstName, LastName FROM contractors;
Copy

Snowflake

 SELECT
LastName,
FirstName FROM
employees
INTERSECT
SELECT
FirstName,
LastName FROM
contractors;

SELECT
LastName,
FirstName FROM
employees
INTERSECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!! ALL
SELECT
FirstName,
LastName FROM
contractors;
Copy

Bekannte Probleme

1. INTERSECT ALL unsupported

INTERSECT ALL wird in Snowflake nicht unterstützt und dann wird der Teil ALL kommentiert.

Zugehörige EWIs

  1. [SSC-EWI-0040](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0040): Anweisung wird nicht unterstützt.

UPDATE-Anweisung

Siehe UPDATE-Anweisung

Teradata unterstützt den Verweis auf einen Alias, bevor dieser deklariert wird, Snowflake jedoch nicht. Die Transformation für dieses Szenario besteht darin, die referenzierte Tabelle zu nehmen und den Alias für den Tabellennamen zu ändern, auf den sie verweist.

Teradata

 -- Case 1, THERE IS A REFERENCE TO TABLE2 IN THE SET CLAUSE WITHOUT A FROM
 
 UPDATE CRASHDUMPS.TABLE1 i
 SET COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
 WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
 AND i.COLUMN3 = 'L';

 -- CASE 2, FORWARD ALIAS
 UPDATE i
 FROM CRASHDUMPS.TABLE2, CRASHDUMPS.TABLE1 i
 SET COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
 WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
 AND i.COLUMN3 = 'L';
Copy

Snowflake

 -- Case 1, THERE IS A REFERENCE TO TABLE2 IN THE SET CLAUSE WITHOUT A FROM
UPDATE CRASHDUMPS.PUBLIC.TABLE1 AS i
SET i.COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
AND i.COLUMN3 = 'L';

-- CASE 2, FORWARD ALIAS
UPDATE CRASHDUMPS.PUBLIC.TABLE1 AS i 
SET i.COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3 FROM CRASHDUMPS.PUBLIC.TABLE2
WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
AND i.COLUMN3 = 'L';
Copy

Zugehörige EWIs

Keine zugehörigen EWIs.

WITH-Modifikator

Siehe WITH-Modifikator

Snowflake unterstützt den WITH-Modifikator von Teradata für eine SELECT-Anweisung, die mehrere CTEs (Common Table Expressions) enthält. Teradata unterstützt jede beliebige Reihenfolge der Definition von CTE, unabhängig davon, ob es vor seiner Deklaration referenziert wird oder nicht. Snowflake verlangt jedoch, dass, wenn eine CTE eine andere CTE aufruft, es vor dessen Aufruf definiert werden muss. Dann wird die umgewandelte Sequenz von CTEs innerhalb der WITH in die nicht referenzierte CTEs umgewandelt, dann die CTE, die die nächste CTE aufruft, und so weiter.

Wenn in der Aufrufsequenz von WITH ein Zyklus erkannt wird, wird dieser ohne Änderungen an der Sequenz belassen, wie in einem Beispiel für [SSC-EWI-TD0077](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/teradataEWI. md#ssc-ewi-td0077) Im folgenden Beispiel gibt es zwei CTEs mit den Namen n1 und n2, wobei sich n1 auf n2 bezieht. Dann muss n2 zuerst in Snowflake als der entsprechende konvertierte Code definiert werden.

Bemerkung

Einige Teile des Ausgabecodes werden aus Gründen der Übersichtlichkeit weggelassen.

Teradata

 WITH recursive n1(c1) as (select c1, c3 from t2, n1),
     n2(c2) as (select c2 from tablex)
     SELECT * FROM t1;
Copy

Snowflake

 WITH RECURSIVE n1(c1) AS
(
     SELECT
          c1,
          c3 from
          t2, n1
),
n2(c2) AS
(
     SELECT
          c2 from
          tablex
)
SELECT
     * FROM
     t1;
Copy

Bekannte Probleme

1. Impossible to reorder when cycles were found

Wenn die CTEs-Referenzen analysiert werden und ein Zyklus zwischen den Aufrufen der CTEs liegt, werden die CTEs nicht geordnet.

Zugehörige EWIs

Keine zugehörigen EWIs.

INSERT-Anweisung

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Siehe INSERT-Anweisung

In Teradata gibt es eine alternativeINSERT-Syntax, die den Wert für jede Tabellenspalte inline zuweist. Diese alternative Struktur erfordert eine spezielle Transformation, um in Snowflake unterstützt zu werden. Die Inline-Zuweisung der Werte wird getrennt und innerhalb des VALUES(...)-Teils der Snowflake INSERT INTO-Anweisung platziert.

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'));
Copy

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))));
Copy

Bekannte Probleme

Es wurden keine Probleme gefunden.

Zugehörige EWIs

Keine zugehörigen EWIs.

LOGGING ERRORS

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Bemerkung

Nicht relevante Anweisung.

Warnung

Beachten Sie, dass diese Anweisung aus der Migration entfernt wurde, da sie eine nicht relevante Syntax darstellt. Das bedeutet, dass sie in Snowflake nicht erforderlich ist.

Beschreibung

Anweisung zur Protokollierung von Fehlern bei der Verwendung von Anweisungen als INSERT...SELECT. Bitte lesen Sie die folgende Dokumentation.

Beispielhafte Quellcode-Muster

LOGGING ERRORS

Beachten Sie in diesem Beispiel, dass LOGGING ERRORS entfernt wurde, weil es keine relevante Syntax ist. Die Syntax ist in Snowflake nicht erforderlich.

 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS;
Copy
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
Copy
LOGGING ALL ERRORS

Beachten Sie in diesem Beispiel, dass LOGGING ALL ERRORS entfernt wurde, weil es keine relevante Syntax ist. Die Syntax ist in Snowflake nicht erforderlich.

 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ALL ERRORS;
Copy
 INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
Copy
LOGGING ERRORS WITH NO LIMIT

Beachten Sie in diesem Beispiel, dass LOGGING ERRORS WITH NO LIMIT entfernt wurde, weil es keine relevante Syntax ist. Die Syntax ist in Snowflake nicht erforderlich.

 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS WITH NO LIMIT;
Copy
 INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
Copy
LOGGING ERRORS WITH LIMIT OF

Beachten Sie in diesem Beispiel, dass LOGGING ERRORS WITH LIMIT OF entfernt wurde, weil es keine relevante Syntax ist. Die Syntax ist in Snowflake nicht erforderlich.

 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS WITH LIMIT OF 100;
Copy
 INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
Copy

Bekannte Probleme

Es wurden keine Probleme gefunden.

Zugehörige EWIs

Keine zugehörigen EWIs.

SELECT-Anweisung

Siehe SELECT-Anweisung

Snowflake unterstützt die SELECT-Syntax von Teradata mit ein paar Ausnahmen. Vor allem unterstützt es nicht die Abkürzung SEL.​

Teradata

 SEL DISTINCT col1, col2 FROM table1
Copy

Snowflake

 SELECT DISTINCT col1,
col2 FROM
table1;
Copy

Teradata unterstützt den Verweis auf einen Alias, bevor dieser deklariert wird, Snowflake jedoch nicht. Die Transformation für dieses Szenario besteht darin, die referenzierte Spalte zu nehmen und den Alias für den Spaltennamen zu ändern, auf den sie verweist.

Teradata

 SELECT
my_val, sum(col1),
col2 AS my_val FROM table1
Copy

Snowflake

 SELECT
my_val,
sum(col1),
col2 AS my_val FROM
table1;
Copy

Entfernte Klausel-Optionen

Die folgenden Klausel-Optionen sind für Snowflake nicht relevant, daher werden sie bei der Migration entfernt.

Teradata

Snowflake

Expand on

Nicht unterstützt

NORMALIZE

Nicht unterstützt

Mit Prüfoption (Abfrage)

Nicht unterstützt

Bekannte Probleme

1. SEL abbreviation unsupported

Die Abkürzung wird in Snowflake nicht unterstützt, aber sie wird korrekt übersetzt, wenn sie in SELECT geändert wird.

Zugehörige EWIs

Keine zugehörigen EWIs.

ANY-Prädikat

Warnung

Dies ist eine in Arbeit befindliche Version, Änderungen können in Zukunft vorgenommen werden.

Beschreibung

In Teradata ist die Quantifizierung in einer Vergleichsoperation oder einem IN/NOT IN Prädikat möglich. Der Vergleich von Ausdruck und mindestens einem Wert in der Menge der von der Unterabfrage zurückgegebenen Werte ist „true“. Bitte lesen Sie die folgende Teradata-Dokumentation für weitere Informationen.

Teradata-Syntax

 { expression quantifier ( literal [ {, | OR} ... ] ) |
  { expression | ( expression [,...] ) } quantifier ( subquery )
}
Copy

Wo Quantifizierer:

 { comparison_operator [ NOT ] IN } { ALL |ANY | SOME }
Copy

Snowflake-Syntax

In Form einer Unterabfrage entspricht IN = ANY und NOT IN entspricht <> ALL. In der folgenden Snowflake-Dokumentation finden Sie weitere Informationen.

So vergleichen Sie einzelne Werte:

 <value> [ NOT ] IN ( <value_1> [ , <value_2> ...  ] )
Copy

So vergleichen Sie_row constructors_ (eingeklammerte Listen von Werten):

 ( <value_A> [, <value_B> ... ] ) [ NOT ] IN (  ( <value_1> [ , <value_2> ... ] )  [ , ( <value_3> [ , <value_4> ... ] )  ...  ]  )
Copy

So vergleichen Sie einen Wert mit den von einer Unterabfrage zurückgegebenen Werten:

 <value> [ NOT ] IN ( <subquery> )
Copy

Sample Source Patterns

Beispieldaten

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);
Copy

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);
Copy
Gleichwertiges ANY-Prädikat in der WHERE-Klausel

Teradata

 SELECT DeptNo
FROM Employee
WHERE DeptNo = ANY(100,300,500) ;
Copy

DeptNo

100

500

100

300

Snowflake

 SELECT DeptNo
FROM Employee
WHERE DeptNo IN(100,300,500) ;
Copy

DeptNo

100

500

100

300

Andere Vergleichsoperatoren in der WHERE-Klausel

Wenn es andere Vergleichsoperatoren gibt, besteht die entsprechende Übersetzung darin, eine Unterabfrage mit der erforderlichen Logik hinzuzufügen.

Teradata

 SELECT Name, DeptNo
FROM Employee
WHERE DeptNo < ANY(100,300,500) ;
Copy

Name

DeptNo

Eva

100

Alice

100

David

200

Bob

300

Snowflake

 SELECT Name, DeptNo
FROM Employee
WHERE DeptNo < ANY 
(SELECT DeptNo
FROM Employee
WHERE DeptNo > 100
OR DeptNo > 300
OR DeptNo > 500);
Copy

NAME

DEPTNO

Alice

100

Eva

100

Bob

300

David

200

IN ANY in WHERE-Klausel

Teradata

 SELECT DeptNo
FROM Employee
WHERE DeptNo IN ANY(100,300,500) ;
Copy

DeptNo

100

500

100

300

Snowflake

 SELECT DeptNo
FROM Employee
WHERE DeptNo IN(100,300,500) ;
Copy

DeptNo

100

500

100

300

NOT IN ALL in WHERE-Klausel

Teradata

 SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN ALL(100, 200);
Copy

Name

DeptNo

Charlie

500

Bob

300

Snowflake

 SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN (100, 200);
Copy

Name

DeptNo

Charlie

500

Bob

300

Known Issues

NOT IN ANY in WHERE-Klausel

Teradata

 SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN ANY(100, 200);
Copy

Name

DeptNo

Eva

100

Charlie

500

Alice

100

David

200

Bob

300

Snowflake

 SELECT Name, DeptNo
FROM Employee
WHERE DeptNo IN (100, 200)
   OR DeptNo NOT IN (100, 200);
Copy

Name

DeptNo

Eva

100

Charlie

500

Alice

100

David

200

Bob

300

Related EWIs

Keine zugehörigen EWIs.

EXPAND ON-Klausel

Description

Die EXPAND ON-Klausel erweitert eine Spalte mit dem Datentyp Zeitraum und erstellt eine regelmäßige Zeitreihe von Zeilen, die auf dem Zeitraumwert in der Eingabezeile basiert. Weitere Informationen zur EXPAND ON-Klausel finden Sie in der Teradata-Dokumentation.

Sample Source Patterns

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beispieldaten
 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'
        )
    );
Copy
 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 ***/!!!);
Copy
EXPAND ON-Klausel

Angenommen, Sie möchten die Spalte für den Zeitraum um Sekunden erweitern. Für diese EXPAND ON-Klausel gibt es eine Erweiterung des Ankerzeitraums und eine Erweiterung des Intervallliterales.

Erweiterung des Ankerzeitraums

 SELECT
    id,
    BEGIN(bg)
FROM
    table1 EXPAND ON pd AS bg BY ANCHOR ANCHOR_SECOND;
Copy

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 unterstützt die EXPAND ON-Klausel nicht. Um die gleichen Ergebnisse und die gleiche Funktionalität zu reproduzieren, wird der Teradata SQL-Code in einem CTE-Block enthalten, mit einer EXPAND\_ON\_UDF- und TABLE-Funktion gespeichert. Die FLATTEN-Funktion verwendet, um mehrere Zeilen zurückzugeben, ROW\_COUNT\_UDF und DIFF\_TTIME\_PERIOD\_UDF werden verwendet, um anzuzeigen, wie viele Zeilen benötigt werden und die Rückgabe von VALUE hilft EXPAND\_ON\_UDF dabei, die verschiedenen regelmäßigen Zeitreihen zu berechnen. Dieser CTE-Block gibt denselben Alias für die zu erweiternden Spalten zurück wie in der EXPAND ON-Klausel, so dass das Ergebnis in jeder Verwendung des Datentyps Zeitraum verwendet werden kann.

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

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

Bekannte Probleme

Die EXPAND ON-Klausel kann eine Erweiterung von Intervall-Literalen verwenden. In diesem Fall fügt SnowConvert einen Fehler hinzu, dass diese Übersetzung geplant ist.

Erweiterung von Intervall-Literalen
 SELECT
    id,
    BEGIN(bg)
FROM
    table1 EXPAND ON pd AS bg BY INTERVAL '1' SECOND;
Copy

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

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

Zugehörige EWIs

  1. [SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.

  2. [SSC-EWI-TD0053](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/teradataEWI. md#ssc-ewi-td0053): Snowflake unterstützt den Datentyp Zeitraum nicht, alle Zeiträume werden stattdessen als Varchar behandelt.

NORMALIZE

Beschreibung

NORMALIZE legt fest, dass Werte für den Zeitraum in der Spalte des ersten Zeitraums, die übereinstimmen oder sich überschneiden, zu einem Zeitraum zusammengefasst werden, die die Einzelwerte des Zeitraums umfasst. Weitere Informationen zur NORMALIZE-Klausel finden Sie in der Teradata-Dokumentation.

Beispielhafte Quellcode-Muster

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Beispieldaten
 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')
    );
Copy
 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 ***/!!!);
Copy
NORMALIZE-Klausel

Nehmen wir an, Sie möchten die NORMALIZE-Klausel mit der Mitarbeiter-ID verwenden.

 SELECT
    NORMALIZE emp_id,
    duration
FROM
    project;
Copy

EMP_ID

DURATION

20

(2010-03-10, 2010-07-20)

10

(2010-01-10, 2010-08-18)

20

(2020-05-10, 2010-09-20)

 !!!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;
Copy

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

Bekannte Probleme

Die Klausel kann ON MEETS OR OVERLAPS, ON OVERLAPS oder ON OVERLAPS OR MEETS verwenden. In diesen Fällen wird SnowConvert einen Fehler hinzufügen, dass diese Übersetzung für die Zukunft geplant ist.

 SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration FROM table1;
Copy
 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;
Copy

Zugehörige EWIs

  1. [SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.

  2. [SSC-EWI-TD0079](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/teradataEWI. md#ssc-ewi-td0079): Die erforderliche Spalte für den Zeitraumtyp wurde nicht gefunden.

  3. [SSC-EWI-TD0053](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/teradataEWI. md#ssc-ewi-td0053): Snowflake unterstützt den Datentyp Zeitraum nicht, alle Zeiträume werden stattdessen als Varchar behandelt.

Reset When

Beschreibung

„Reset When“ bestimmt die Partition, auf der eine SQL Fensterfunktion basierend auf einer bestimmten Bedingung arbeitet. Wenn die Bedingung „true“ lautet, wird eine neue dynamische Unterpartition innerhalb der bestehenden Fensterpartition erstellt. Weitere Informationen zu „Reset When“ finden Sie in der [Teradata-Dokumentation] (https://docs.teradata.com/reader/1DcoER_KpnGTfgPinRAFUw/b7wL86OoMTPno6hrSPNdDg).

Beispielhafte Quellcode-Muster

Beispieldaten

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);
Copy

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);
Copy

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

Nehmen wir an, Sie möchten für jedes Konto die Abfolge 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.

Um diese Daten zu analysieren, verwendet Teradata SQL eine Fensterfunktion mit einem verschachtelten Aggregat und einer Anweisung „Reset When“, wie folgt:

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;
Copy
account_idmonth_idbalancebalance_increase
11600
12991
13940
14900
15800
16881
17902
18923
19100
110601
111802
112100

Snowflake

Snowflake unterstützt die RESET WHEN-Klausel in Fensterfunktionen nicht. Um das gleiche Ergebnis zu erzielen, muss der Teradata SQL-Code mit der nativen SQL-Syntax und verschachtelten Unterabfragen wie folgt übersetzt werden:

 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;
Copy
account_idmonth_idbalancebalance_increase
11600
12991
13940
14900
15800
16881
17902
18923
19100
110601
111802
112100

Zwei verschachtelte Abfragen sind erforderlich, um die Funktion „Reset When“ Snowflake zu unterstützen.

In der inneren Unterabfrage wird ein dynamisches Partitionskennzeichen (dynamic_part) erstellt und ausgefü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 wird ein neues Attribut _dynamic_part als Ergebnis einer SUM Fensterfunktion erzeugt.

Schließlich wird ein new_dynamic_part als neues Partitionsattribut (dynamische Partition) zum bestehenden Partitionsattribut (account_id) hinzugefügt und die gleiche ROW_NUMBER() Fensterfunktion wie in Teradata angewendet.

Nach diesen Änderungen erzeugt Snowflake die gleiche Ausgabe wie Teradata.

„Reset When“, wenn die bedingte Fensterfunktion eine Spalte ist

Dasselbe Beispiel wie oben, nur dass jetzt die Fensterfunktion, die in der Bedingung RESET WHEN verwendet wird, als eine Spalte mit dem Namen vorherige definiert ist. Diese Variante ändert die Transformation leicht, da es nicht mehr notwendig ist, die vorheriger_Wert wie im vorherigen Beispiel zu definieren. Es ist die gleiche Umgehungsmöglichkeit.

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;
Copy
account_idmonth_idbalancepreviousbalance_increase
11600
1299601
1394990
1490940
1580900
1688801
1790882
1892903
1910920
11060101
11180602
11210800

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;
Copy
account_idmonth_idbalancepreviousbalance_increase
11600
1299601
1394990
1490940
1580900
1688801
1790882
1892903
1910920
11060101
11180602
11210800

Bekannte Probleme

Die Klausel RESET WHEN kann einige Variationen aufweisen, wie z. B. ihre Bedingung. Derzeit unterstützt SnowConvert nur binäre Bedingungen (<=, >=, <> oder =), in jedem anderen Typ, wie IS NOT NULL, SnowConvert wird die Klausel RESET WHEN entfernt und eine Fehlermeldung hinzugefügt, da sie in Snowflake nicht unterstützt wird, wie im folgenden Beispiel gezeigt.

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

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

Zugehörige EWIs

  • [SSC-EWI-TD0077](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/teradataEWI. md#ssc-ewi-td0077): RESET WHEN Klausel wird in diesem Szenario aufgrund ihrer Bedingung nicht unterstützt.

SAMPLE-Klausel.

Beschreibung

Die SAMPLE-Klausel in Teradata reduziert die Anzahl der zu verarbeitenden Zeilen und gibt ein oder mehrere Beispiele von Zeilen als Liste von Brüchen oder als Liste von Zeilenzahlen zurück. Die Klausel wird in der Abfrage SELECT verwendet. Bitte lesen Sie die folgende Teradata-Dokumentation für weitere Informationen.

Teradata-Syntax

 SAMPLE
  [ WITH REPLACEMENT ]
  [ RANDOMIZED LOCALIZATION ]
  { { fraction_description | count_description } [,...] |
    when_clause ]
  }
Copy

Snowflake-Syntax

Weitere Informationen finden Sie in der folgenden Snowflake-Dokumentation. SAMPLE und TABLESAMPLE sind synonym.

 SELECT ...
FROM ...
  { SAMPLE | TABLESAMPLE } [ samplingMethod ]
[ ... ]
Copy

Wobei:

 samplingMethod ::= { 
{ BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) |
{ SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
Copy
  • In Snowflake können die folgenden Schlüsselwörter austauschbar verwendet werden:

    • SAMPLE | TABLESAMPLE

    • BERNOULLI | ROW

    • SYSTEM | BLOCK

    • REPEATABLE | SEED

Sehen Sie sich die folgende Tabelle an, um die wichtigsten Unterschiede zu überprüfen.

SAMPLE-Verhalten

Teradata

Snowflake

Beispiel nach Wahrscheinlichkeit

Auch bekannt als Bruchteilbeschreibung. Es muss eine Bruchzahl zwischen 0,1 und 1 sein.

Dezimalzahl zwischen 0 und 100.

Feste Anzahl von Zeilen

Auch bekannt als Zählbeschreibung. Es handelt sich um eine positive ganze Zahl, die die Anzahl der zu erfassenden Zeilen bestimmt.

Er gibt die Anzahl der Zeilen (bis zu 1.000.000) an, die aus der Tabelle entnommen werden sollen. Kann eine beliebige ganze Zahl zwischen 0 (keine Zeilen ausgewählt) und einschließlich 1000000 sein.

Wiederholte Zeilen

Bekannt als WITH REPLACEMENT. Damit können Sie mehr Beispiele abfragen, als Zeilen in der Tabelle vorhanden sind.

Bekannt als REPEATABLE oder SEED. Wird verwendet, um die Abfrage festzulegen. Das bedeutet, dass bei jeder Abfrage derselbe Satz von Zeilen verwendet wird.

Stichprobenverfahren

Proportional und RANDOMIZED ALLOCATION.

BERNOULLI oder SYSTEM.

Beispielhafte Quellcode-Muster

Beispieldaten

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);
Copy

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);
Copy
SAMPLE-Klausel.

Feste Anzahl von Zeilen

Beachten Sie, dass in diesem Beispiel die Anzahl der Zeilen eine feste Zahl ist, aber nicht unbedingt bei jedem Durchlauf das gleiche Ergebnis erzielt wird.

Teradata

 SELECT * FROM Employee SAMPLE 2;
Copy

2 Zeilen.

Snowflake

 SELECT * FROM Employee SAMPLE (2 ROWS);
Copy

2 Zeilen.

Zeilennummer basierend auf der Wahrscheinlichkeit

Diese Option gibt eine Vielzahl von Zeilen zurück, abhängig von der eingestellten Wahrscheinlichkeit.

Teradata

 SELECT * FROM Employee SAMPLE 0.25;
Copy

25 % der Wahrscheinlichkeit für jede Zeile: 1 Ausgabezeile.

Snowflake

 SELECT * FROM Employee SAMPLE (25);
Copy

25 % der Wahrscheinlichkeit für jede Zeile: 1 Ausgabezeile.

Bekannte Probleme

Feste Anzahl von Zeilen mit Ersetzung

Diese Option gibt eine feste Anzahl von Zeilen zurück und erlaubt die Wiederholung der Zeilen. In Snowflake ist es nicht möglich, mehr Beispiele als Zeilen in einer Tabelle anzufordern.

Teradata-Beispiel

 SELECT * FROM Employee SAMPLE WITH REPLACEMENT 8;
Copy

EmpNo

Name

DeptNo

5

Eva

100

5

Eva

100

5

Eva

100

4

David

200

4

David

200

3

Charlie

500

1

Alice

100

1

Alice

100