Catégories :

Syntaxe de requête

AT | BEFORE

La clause AT ou BEFORE est utilisée pour Snowflake Time Travel. Dans une requête, elle est spécifiée dans la clause FROM immédiatement après le nom de la table et détermine le moment passé à partir duquel les données historiques sont demandées pour l’objet :

  • Le mot clé AT spécifie que la requête inclut tous les changements apportés par une instruction ou une transaction dont l’horodatage est égal au paramètre spécifié.

  • Le mot clé BEFORE spécifie que la requête se réfère à un point précédant immédiatement le paramètre spécifié.

Pour plus d’informations, voir Comprendre et utiliser la fonction « Time Travel ».

Voir aussi :

FROM

Syntaxe

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

Spécifie une date et une heure exactes à utiliser pour Time Travel. La valeur doit être explicitement convertie en TIMESTAMP.

OFFSET => time_difference

Spécifie la différence en secondes par rapport au temps actuel à utiliser pour Time Travel, sous la forme -NN peut être un entier ou une expression arithmétique (par exemple, -120 correspond à 120 secondes, -30*60 correspond à 1800 secondes ou 30 minutes).

STATEMENT => id

Spécifie l’ID d’une requête à utiliser comme point de référence pour Time Travel. Ce paramètre prend en charge toute instruction de l’un des types suivants :

  • DML (par ex. INSERT, UPDATE, DELETE)

  • TCL (transaction BEGIN, COMMIT)

  • SELECT

L’ID de requête doit faire référence à une requête qui a été exécutée au cours des 14 derniers jours. Si l’ID de requête fait référence à une requête datant de plus de 14 jours, l’erreur suivante est renvoyée :

Error: statement <query_id> not found

Pour contourner cette limitation, utilisez l’horodatage de la requête référencée.

STREAM => 'name'

Spécifie l’identificateur (c’est-à-dire le nom) d’un flux existant sur la table ou la vue interrogée. Le décalage actuel dans le flux est utilisé comme le point AT dans le temps pour renvoyer les données de changement pour l’objet source.

Ce mot-clé est pris en charge uniquement lors de la création d’un flux (à l’aide de CREATE STREAM) ou de l’interrogation de données de modifications (à l’aide de la clause CHANGES). Pour des exemples, voir ces rubriques.

Notes sur l’utilisation

  • Les données contenues dans Snowflake sont identifiées par des horodatages qui peuvent légèrement différer de la valeur exacte de l’heure système.

  • La valeur de TIMESTAMP ou OFFSET doit être une expression constante.

  • La résolution temporelle la plus petite pour TIMESTAMP est exprimée en millisecondes.

  • Si les données demandées sont au-delà de la période de conservation de Time Travel (1 jour par défaut), l’instruction échoue.

    De plus, si les données demandées se trouvent dans la période de conservation de Time Travel, mais qu’aucune donnée historique n’est disponible (par exemple, si la période de conservation a été prolongée), l’instruction échoue.

  • Si la durée Time Travel spécifiée est égale ou antérieure au moment où l’objet a été créé, l’instruction échoue.

  • Lors de l’accès aux données historiques de la table, le schéma de la table en cours est utilisé (colonnes, valeurs par défaut, etc.).

  • Les données historiques ont les mêmes exigences de contrôle d’accès que les données actuelles. Toutes les modifications sont appliquées rétroactivement.

Dépannage

Erreur

Time travel data is not available for table <tablename>

Cause

Dans certains cas, cela est dû à l’utilisation d’une chaîne dans laquelle un horodatage est attendu.

Solution

Transforme la chaîne en un horodatage.

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

Exemples

Sélectionnez les données historiques d’une table en utilisant un horodatage spécifique :

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

Sélectionnez les données historiques d’une table datant d’il y a 5 minutes :

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

Sélectionnez les données historiques d’une table jusqu’à, mais sans inclure les modifications apportées par la transaction spécifiée :

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

Renvoie la différence dans les données de table résultant de la transaction spécifiée :

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