SnowConvert AI – Teradata – DML

In diesem Abschnitt finden Sie die Dokumentation für die Übersetzungsreferenz von Elementen der Datenmanipulationssprache.

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

Delete

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

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

Die SQL-Mengenoperatoren bearbeiten die Resultsets mehrerer Abfragen und kombinieren die Ergebnisse jeder Abfrage zu einem einzigen Resultset.

Bemerkung

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

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

Intersect

 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

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;
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: Anweisung nicht unterstützt.

UPDATE-Anweisung

Beschreibung

Ändert Spaltenwerte in vorhandenen Zeilen einer Tabelle. (Teradata SQL-Sprachreferenz – UPDATE)

Beispielhafte Quellcode-Muster

Grundlegender Fall

Teradata

Update

 UPDATE CRASHDUMPS.TABLE1 i
 SET COLUMN4 = CRASHDUMPS.TABLE2.COLUMN3
 WHERE i.COLUMN1 = CRASHDUMPS.TABLE2.COLUMN1
 AND i.COLUMN3 = 'L';
Copy

Snowflake

Update

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

UPDATE mit Vorwärtsalias

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

Update

 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

Update

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

UPDATE mit der Zieltabelle in der FROM-Klausel

Teradata unterstützt die Definition der Zieltabelle in der FROM-Klausel. Dies wurde in Snowflake entfernt, um Fehler durch doppelte Aliase und mehrdeutige Spaltenreferenzen zu vermeiden.

Teradata

Update

UPDATE some_table
FROM some_table
SET Code = Code + 100
WHERE Name = 'A';
Copy

Snowflake

Update

UPDATE some_table
  SET Code = Code + 100
  WHERE
  UPPER(RTRIM( Name)) = UPPER(RTRIM('A'));
Copy

Zugehörige EWIs

Keine zugehörigen EWIs.

WITH-Modifikator

Wählen Sie eine Anweisung aus, die den WITH-Modifikator mit einer Liste von mehreren benannten Abfragen verwendet, die auch als allgemeine Tabellenausdrücke (CTEs) bekannt sind.

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 WITH-Aufrufsequenz ein Zyklus erkannt wird, wird sie im ursprünglichen Zustand beibehalten, ohne dass Änderungen an der Sequenz vorgenommen werden, wie in einem Beispiel für den SSC-EWI-TD0077 gezeigt.

Im folgenden Beispiel gibt es zwei CTEs mit den Namen n1 und n2, wobei sich n1 auf n2 bezieht. n2 muss dann zuerst in Snowflake als der entsprechende konvertierte Code definiert werden.

Bemerkung

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

Teradata

WITH-Modifikator

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

Snowflake

WITH-Modifikator

 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

SQL-Anweisung, die neue Zeilen zu einer Tabelle hinzufügt.

Bemerkung

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

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

 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

 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 es sich um eine nicht relevante Syntax handelt. 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.

Teradata
 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS;
Copy
Snowflake
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;

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.

Teradata
 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ALL ERRORS;
Copy
Snowflake
 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.

Teradata
 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS WITH NO LIMIT;
Copy
Snowflake
 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.

Teradata
 INSERT INTO MY_TABLE
SELECT *
FROM MY_SAMPLE
LOGGING ERRORS WITH LIMIT OF 100;
Copy
Snowflake
 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

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

Teradata

Sel

SEL DISTINCT col1, col2 FROM table1
Copy

Snowflake

Select

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

Alias

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

Snowflake

Alias

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

SuccessPlaceholder

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

Beispielhafte Quellcode-Muster

Beispieldaten

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

Entspricht dem ANY-Prädikat in der WHERE-Klausel

Teradata

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

DeptNo

100

500

100

300

Snowflake

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

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

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

Name

DeptNo

Eva

100

Alice

100

David

200

Bob

300

Snowflake

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

NAME

DEPTNO

Alice

100

Eva

100

Bob

300

David

200

IN ANY in WHERE-Klausel

Teradata

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

DeptNo

100

500

100

300

Snowflake

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

DeptNo

100

500

100

300

NOT IN ALL in WHERE-Klausel

Teradata

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

Name

DeptNo

Charlie

500

Bob

300

Snowflake

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

Name

DeptNo

Charlie

500

Bob

300

Bekannte Probleme

NOT IN ANY in WHERE-Klausel

Teradata

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

Name

DeptNo

Eva

100

Charlie

500

Alice

100

David

200

Bob

300

Snowflake

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

Name

DeptNo

Eva

100

Charlie

500

Alice

100

David

200

Bob

300

Zugehörige EWIs

Keine zugehörigen EWIs.

EXPAND ON-Klausel

Übersetzungsreferenz zur Konvertierung der Expand On-Funktion von Teradata in Snowflake

Beschreibung

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.

Beispielhafte Quellcode-Muster

Bemerkung

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

Beispieldaten

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'
        )
    );
Copy
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 ***/!!!);
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
Teradata
 SELECT
    id,
    BEGIN(bg)
FROM
    table1 EXPAND ON pd AS bg BY ANCHOR ANCHOR_SECOND;
Copy
Ergebnis

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.

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

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 AI den Fehler hinzu, dass diese Übersetzung geplant ist.

Erweiterung von Intervall-Literalen

Teradata
 SELECT
    id,
    BEGIN(bg)
FROM
    table1 EXPAND ON pd AS bg BY INTERVAL '1' SECOND;
Copy
Ergebnis

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;
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: Snowflake unterstützt nicht den Zeittyp, da alle Zeiträume stattdessen als varchar behandelt werden.

NORMALIZE

Übersetzungsreferenz zur Konvertierung der Normalize-Funktion von Teradata in Snowflake

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

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

NORMALIZE-Klausel

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

Teradata
 SELECT
    NORMALIZE emp_id,
    duration
FROM
    project;
Copy
Ergebnis

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

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 Normalize-Klausel kann ON MEETS OR OVERLAPS, ON OVERLAPS oder ON OVERLAPS OR MEETS verwenden. Für diese Fälle fügt SnowConvert AI den Fehler hinzu, dass diese Übersetzung für die Zukunft geplant ist.

Teradata

 SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration FROM table1;
Copy
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;
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: Die erforderliche Spalte für den Zeitraum wurde nicht gefunden.

  3. SSC-EWI-TD0053: Snowflake unterstützt nicht den Zeittyp, da alle Zeiträume stattdessen als varchar behandelt werden.

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

Abfrage

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

Ergebnis

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

Abfrage

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

Ergebnis

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

Abfrage

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

Ergebnis

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:

Abfrage

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

Ergebnis

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

Abfrage

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

Ergebnis

account_idmonth_idbalancepreviousbalance_increase
11600
1299601
1394990
1490940
1580900
1688801
1790882
1892903
1910920
11060101
11180602
11210800
Snowflake

Abfrage

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

Ohne Titel

account_idmonth_idbalancepreviousbalance_increase
11600
1299601
1394990
1490940
1580900
1688801
1790882
1892903
1910920
11060101
11180602
11210800

Bekannte Probleme

Bei der RESET WHEN-Klausel kann es einige Variationen geben, z. B. bei ihrer Bedingung. Derzeit unterstützt SnowConvert AI nur binäre Bedingungen (<=, >=, <> oder =), bei allen anderen Typen als IS NOT NULL entfernt SnowConvert AI die RESET WHEN-Klausel und fügt eine Fehlermeldung hinzu, da dies in Snowflake nicht unterstützt wird, wie im folgenden Beispiel gezeigt.

Teradata

Abfrage

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

Abfrage

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

Abfrage

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

Abfrage

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

Eingabe

SELECT * FROM Employee SAMPLE 2;
Copy

Ausgabe 2 Zeilen.

Snowflake

Eingabe

SELECT * FROM Employee SAMPLE (2 ROWS);
Copy

Ausgabe 2 Zeilen.

Anzahl der Zeilen auf Basis der Wahrscheinlichkeit

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

Teradata

Eingabe

SELECT * FROM Employee SAMPLE 0.25;
Copy

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

Snowflake

Eingabe

SELECT * FROM Employee SAMPLE (25);
Copy

Ausgabe 25 % 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

Eingabe

SELECT * FROM Employee SAMPLE WITH REPLACEMENT 8;
Copy

Ausgabe

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

Bedingtes Sampling

In Snowflake gibt es kein bedingtes Sampling. Dies kann durch Verwendung von CTEs erreicht werden.

Teradata-Beispiel

Eingabe

SELECT * FROM employee
SAMPLE WHEN DeptNo > 100 then 0.9 
ELSE 0.1 END;
Copy

Ausgabe

EmpNo

Name

DeptNo

3

Charlie

500

4

David

200

2

Bob

300

Zugehörige EWIs

SSC-EWI-0021: Syntax wird von Snowflake nicht unterstützt.