SnowConvert AI – Teradata – DML¶
In diesem Abschnitt finden Sie die Dokumentation für die Übersetzungsreferenz von Elementen der Datenmanipulationssprache.
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
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
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;
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.
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
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;
Bekannte Probleme¶
1. INTERSECT ALL unsupported¶
INTERSECT ALL wird in Snowflake nicht unterstützt und dann wird der Teil ALL kommentiert.
Zugehörige EWIs¶
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';
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'));
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';
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'));
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';
Snowflake
Update
UPDATE some_table
SET Code = Code + 100
WHERE
UPPER(RTRIM( Name)) = UPPER(RTRIM('A'));
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.
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 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;
Snowflake
WITH-Modifikator¶
WITH RECURSIVE n1(c1) AS
(
SELECT
c1,
c3 from
t2, n1
),
n2(c2) AS
(
SELECT
c2 from
tablex
)
SELECT
* FROM
t1;
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.
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¶
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¶
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))));
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;
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;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
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;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
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;
Snowflake¶
INSERT INTO MY_TABLE SELECT
*
FROM
MY_SAMPLE;
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
SEL DISTINCT col1, col2 FROM table1
Snowflake
Select
SELECT DISTINCT col1,
col2 FROM
table1;
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
Snowflake
Alias
SELECT
my_val,
SUM(col1),
col2 AS my_val FROM
table1;
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 )
}
Wo Quantifizierer:
{ comparison_operator [ NOT ] IN } { ALL |ANY | SOME }
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> ... ] )
So vergleichen Sie_row constructors_ (eingeklammerte Listen von Werten):
( <value_A> [, <value_B> ... ] ) [ NOT ] IN ( ( <value_1> [ , <value_2> ... ] ) [ , ( <value_3> [ , <value_4> ... ] ) ... ] )
So vergleichen Sie einen Wert mit den von einer Unterabfrage zurückgegebenen Werten:
<value> [ NOT ] IN ( <subquery> )
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);
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);
Entspricht dem ANY-Prädikat in der WHERE-Klausel ¶
Teradata
Eingabe¶
SELECT DeptNo
FROM Employee
WHERE DeptNo = ANY(100,300,500) ;
Ausgabe¶
DeptNo |
|---|
100 |
500 |
100 |
300 |
Snowflake
Eingabe¶
SELECT DeptNo
FROM Employee
WHERE DeptNo IN(100,300,500) ;
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) ;
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);
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) ;
Ausgabe¶
DeptNo |
|---|
100 |
500 |
100 |
300 |
Snowflake
Eingabe¶
SELECT DeptNo
FROM Employee
WHERE DeptNo IN(100,300,500) ;
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);
Ausgabe¶
Name |
DeptNo |
|---|---|
Charlie |
500 |
Bob |
300 |
Snowflake
Eingabe¶
SELECT Name, DeptNo
FROM Employee
WHERE DeptNo NOT IN (100, 200);
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);
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);
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'
)
);
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-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;
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;
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;
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;
Zugehörige EWIs¶
[SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
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')
);
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-Klausel¶
Nehmen wir an, Sie möchten die NORMALIZE-Klausel mit der Mitarbeiter-ID verwenden.
Teradata¶
SELECT
NORMALIZE emp_id,
duration
FROM
project;
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;
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;
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;
Zugehörige EWIs¶
[SSC-EWI-0073](../../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
SSC-EWI-TD0079: Die erforderliche Spalte für den Zeitraum wurde nicht gefunden.
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);
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);
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;
Ergebnis
| 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 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;
Ergebnis
| 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 |
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;
Ergebnis
| 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¶
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;
Ohne Titel
| 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 |
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;
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;
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 ]
}
Snowflake-Syntax
Weitere Informationen finden Sie in der folgenden Snowflake-Dokumentation. SAMPLE und TABLESAMPLE sind synonym.
SELECT ...
FROM ...
{ SAMPLE | TABLESAMPLE } [ samplingMethod ]
[ ... ]
Wobei:
samplingMethod ::= {
{ BERNOULLI | ROW } ( { <probability> | <num> ROWS } ) |
{ SYSTEM | BLOCK } ( <probability> ) [ { REPEATABLE | SEED } ( <seed> ) ] }
In Snowflake können die folgenden Schlüsselwörter austauschbar verwendet werden:
SAMPLE | TABLESAMPLEBERNOULLI | ROWSYSTEM | BLOCKREPEATABLE | 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 |
Wiederholte Zeilen |
Bekannt als |
Bekannt als |
Stichprobenverfahren |
Proportional und |
|
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);
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);
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;
Ausgabe 2 Zeilen.
Snowflake
Eingabe
SELECT * FROM Employee SAMPLE (2 ROWS);
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;
Ausgabe 25 % Wahrscheinlichkeit für jede Zeile: 1 Ausgabezeile.
Snowflake
Eingabe
SELECT * FROM Employee SAMPLE (25);
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;
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;
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.