- Catégories :
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 :
Syntaxe¶
SELECT ...
FROM ...
{
AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) |
BEFORE( STATEMENT => <id> )
}
[ ... ]
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
-N
oùN
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.
Lorsque vous accédez aux données historiques d’une table, les résultats incluent les colonnes, les valeurs par défaut, etc. de la définition actuelle de la table. Il en va de même pour les vues non matérialisées. Par exemple, si vous modifiez une table pour y ajouter une colonne, la recherche de données historiques antérieures au moment où la colonne a été ajoutée renvoie des résultats qui incluent la nouvelle colonne.
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
|
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);SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));
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';
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');
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;