Kategorien:

Abfragesyntax

AT | BEFORE

Die AT- oder BEFORE-Klausel wird für Snowflake Time Travel verwendet. In einer Abfrage wird sie in der FROM-Klausel unmittelbar nach dem Tabellennamen angegeben und bestimmt den Punkt in der Vergangenheit, ab dem historische Daten für das Objekt angefordert werden:

  • Das Schlüsselwort AT gibt an, dass die Anforderung alle Änderungen beinhaltet, die durch eine Anweisung oder Transaktion mit einem Zeitstempel gleich dem angegebenen Parameter vorgenommen werden.

  • Das Schlüsselwort BEFORE gibt an, dass sich die Anfrage auf einen Punkt unmittelbar vor dem angegebenen Parameter bezieht.

Weitere Informationen dazu finden Sie unter Verstehen und Verwenden von Time Travel.

Siehe auch:

FROM

Syntax

SELECT ...
FROM ...
  {
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) |
   BEFORE( STATEMENT => <id> )
  }
[ ... ]
Copy
TIMESTAMP => timestamp

Gibt ein genaues Datum und eine genaue Zeit für Time Travel an. Der Wert muss explizit in einen TIMESTAMP-Wert umgewandelt werden.

OFFSET => time_difference

Gibt für Time Travel die Differenz in Sekunden von der aktuellen Zeit im Format -N an, wobei N eine Ganzzahl oder ein arithmetischer Ausdruck sein kann (z. B. entspricht -120 120 Sekunden; -30*60 entspricht 1.800 Sekunden oder 30 Minuten).

STATEMENT => id

Gibt die Abfrage-ID einer Anweisung an, die als Referenzpunkt für Time Travel verwendet werden soll. Dieser Parameter unterstützt alle Anweisungen eines der folgenden Typen:

  • DML (z. B. INSERT, UPDATE, DELETE)

  • TCL (BEGIN, COMMIT-Transaktion)

  • SELECT

Die Abfrage-ID muss auf eine Abfrage verweisen, die innerhalb der letzten 14 Tage ausgeführt wurde. Wenn die Abfrage-ID auf eine Abfrage verweist, die älter als 14 Tage ist, wird der folgende Fehler zurückgegeben:

Error: statement <query_id> not found

Um diese Einschränkung zu umgehen, verwenden Sie den Zeitstempel für die referenzierte Abfrage.

STREAM => 'name'

Gibt den Bezeichner (d. h. den Namen) eines vorhandenen Streams auf der abgefragten Tabelle oder Ansicht an. Der aktuelle Offset im Stream wird als AT-Zeitpunkt für die Rückgabe von Änderungsdaten für das Quellobjekt verwendet.

Dieses Schlüsselwort wird nur beim Erstellen eines Streams (mit CREATE STREAM) oder beim Abfragen von Änderungsdaten (mit der CHANGES-Klausel) unterstützt. Beispiele dazu finden Sie unter diesen Themen.

Nutzungshinweise

  • Daten in Snowflake werden durch Zeitstempel identifiziert, die geringfügig vom genauen Wert der Systemzeit abweichen können.

  • Der Wert für TIMESTAMP oder OFFSET muss ein konstanter Ausdruck sein.

  • Die kleinste Zeitauflösung für TIMESTAMP sind Millisekunden.

  • Wenn die angeforderten Daten die Aufbewahrungsfrist von Time Travel überschreiten (der Standardwert ist 1 Tag), schlägt die Anweisung fehl.

    Wenn außerdem die angeforderten Daten innerhalb der Aufbewahrungsfrist von Time Travel liegen, aber keine historischen Daten verfügbar sind (z. B. wenn der Aufbewahrungsfrist verlängert wurde), schlägt die Anweisung fehl.

  • Wenn die angegebene Time Travel-Zeit zu oder vor dem Zeitpunkt liegt, an dem das Objekt erstellt wurde, schlägt die Anweisung fehl.

  • Für Zugriffe auf historische Tabellendaten wird das aktuelle Tabellenschema verwendet (Spalten, Standardwerte usw.).

  • Historische Daten haben die gleichen Anforderungen an die Zugriffssteuerung wie aktuelle Daten. Änderungen werden rückwirkend übernommen.

Problembehandlung

Fehler

Time travel data is not available for table <tablename>

Ursache

In einigen Fällen wird das Problem durch Verwendung einer Zeichenfolge verursacht, bei der ein Zeitstempel erwartet wird.

Lösung

Wandeln Sie die Zeichenfolge in einen Zeitstempel um.

... AT(TIMESTAMP => '2018-07-27 12:00:00')               -- fails
... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP)    -- succeeds
Copy

Beispiele

Auswählen historischer Daten aus einer Tabelle mit einem bestimmten Zeitstempel:

SELECT * FROM my_table AT(TIMESTAMP => 'Fri, 01 May 2015 16:20:00 -0700'::timestamp);
Copy
SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));
Copy

Auswählen historischer Daten aus einer Tabelle von vor 5 Minuten:

SELECT * FROM my_table AT(OFFSET => -60*5) AS T WHERE T.flag = 'valid';
Copy

Auswählen historischer Daten aus einer Tabelle bis zu einer Änderung (Änderung exklusive), die von der angegebenen Transaktion vorgenommen wurde:

SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');
Copy

Zurückgeben der Differenz in Tabellendaten zurück, die sich aus der angegebenen Transaktion ergibt:

SELECT oldt.* ,newt.*
  FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS oldt
    FULL OUTER JOIN my_table AT(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS newt
    ON oldt.id = newt.id
WHERE oldt.id IS NULL OR newt.id IS NULL;
Copy