「あの時のデータ、もう一度見たい!」を叶えるタイムトラベル
「うっかりUPDATEで値を上書きしちゃった…」「昨日の朝の集計結果ともう一度比べたい!」そんな時に大活躍するのが、Snowflakeのタイムトラベル(Time Travel)機能です。タイムトラベルとは、テーブルの過去のある時点の状態を、まるでタイムマシンのように呼び出せる仕組みのこと。バックアップを取っていなくても、保持期間内であればSELECT文だけで過去データを参照できます。
本記事では、特に「過去データをSELECTで参照する方法」にフォーカスして、AT/BEFORE句の使い方を初心者向けに解説します。タイムトラベルの全体像については Snowflakeタイムトラベル入門|過去データを一発で復元する方法 もあわせてどうぞ。

基本構文:AT句とBEFORE句
過去データを参照するには、SELECT文のFROMの直後にATまたはBEFOREを付けるだけです。
- AT:指定した時点(その瞬間を含む)の状態を参照
- BEFORE:指定した時点の直前の状態を参照
そして、時点の指定方法には3種類あります。
- OFFSET:現在から「何秒前」を指定
- TIMESTAMP:特定の日時を指定
- STATEMENT:特定のクエリID実行直前/直後を指定
3つの指定方法をSQLで試してみよう
① OFFSETで「○秒前」を参照
一番手軽なのがこれ。たとえば「5分前(=300秒前)のテーブルを見たい」場合は次のように書きます。
SELECT *
FROM sales
AT(OFFSET => -60*5);
マイナス値で「過去」を表します。直前のUPDATEミスを確認したい時にサッと使えて便利です。
② TIMESTAMPで「特定日時」を参照
「昨日の23時時点の在庫を見たい」など、明確な時刻を指定したい場合はTIMESTAMPを使います。
SELECT *
FROM sales
AT(TIMESTAMP => '2026-04-30 23:00:00'::TIMESTAMP_LTZ);
日次バッチの結果を後から検証したいケースで重宝します。
③ STATEMENTで「あのクエリの直前」を参照
「さっきのDELETE文の前に戻したい!」というときは、Query IDを指定します。Snowsightの履歴画面からコピーできます。
SELECT *
FROM sales
BEFORE(STATEMENT => '01b2c3d4-0000-abcd-0000-123456789abc');
BEFOREを使うことで、そのクエリが実行される直前のスナップショットを取得できます。

こんなシーンで便利!
- 誤更新の確認:今と過去の値をJOINして差分を比較
- 監査・調査:特定時点のデータをそのままレポート出力
- クローン作成:過去状態を ゼロコピークローン として複製し検証用に使う
たとえば現在と1時間前の売上を比較したい場合、こんな書き方ができます。
SELECT now.id, now.amount AS now_amount, past.amount AS past_amount
FROM sales AS now
JOIN sales AT(OFFSET => -3600) AS past
ON now.id = past.id
WHERE now.amount <> past.amount;
注意点
- 参照できるのは保持期間(DATA_RETENTION_TIME_IN_DAYS)内のみ。標準エディションは最大1日、Enterprise以上は最大90日まで設定可能です。
- トランジェント・一時テーブルはリテンション期間が0または1日に制限されます。
- テーブルがDROPされた後の参照には
UNDROPか、過去IDを使ったクローンが必要です。
まとめ
タイムトラベルは「FROM の後ろに AT/BEFORE を付けるだけ」で過去データを参照できる、Snowflakeならではの強力な機能です。OFFSET・TIMESTAMP・STATEMENTの3つの指定方法を覚えておけば、調査・監査・障害対応などあらゆる場面で慌てず対応できます。普段の SELECT文 にひと工夫加えるだけなので、ぜひ気軽に試してみてください!
参考リンク
関連記事
- Snowflakeタイムトラベル入門|過去データを一発で復元する方法 – タイムトラベルの全体像とUNDROPの使い方を解説
- Snowflakeゼロコピークローン入門|データベースを一瞬で複製する魔法 – 過去スナップショットを丸ごと複製する方法
- Snowflakeのテーブル種類|通常・一時・トランジェントの違いを解説 – リテンション期間の違いを把握しよう
- SnowflakeのSELECT文入門|他DBとの違いを初心者向けに解説 – AT/BEFOREを使うベースとなる構文の基本

