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. Beachten Sie, dass der Wert explizit in einen TIMESTAMP umgewandelt werden muss.

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
Copy

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

Fehlermeldung: Time travel data is not available for table <Tabellenname>

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')               -- wrong
... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP)    -- right
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