カテゴリ:

クエリ構文

AT | BEFORE

AT または BEFORE 句は、Snowflake Time Travelに使用されます。クエリでは、テーブル名の直後の FROM 句で指定され、オブジェクトの履歴データが要求される過去のポイントを決定します。

  • AT キーワードは、指定されたパラメーターに等しいタイムスタンプを持つステートメントまたはトランザクションによって行われた変更が要求に含まれることを指定します。

  • BEFORE キーワードは、要求が指定されたパラメーターの直前のポイントを参照することを指定します。

詳細については、 Time Travelの理解と使用 をご参照ください。

こちらもご参照ください:

FROM

構文

SELECT ...
FROM ...
  {
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) |
   BEFORE( STATEMENT => <id> )
  }
[ ... ]
TIMESTAMP => タイムスタンプ

Time Travelに使用する正確な日付と時刻を指定します。値は明示的に TIMESTAMP にキャストする必要があることに注意してください。

OFFSET => 時差

Time Travelに使用する現在の時刻との差を秒単位で -N の形式で指定します。 N は整数または数式です(例: -120 は120秒、 -30*60 は1800秒または30分)。

STATEMENT => ID

Time Travelの参照ポイントとして使用するステートメントのクエリ ID を指定します。このパラメーターは、次のいずれかのタイプのステートメントをサポートします。

  • DML (例: INSERT、 UPDATE、 DELETE)

  • TCL (BEGIN、 COMMIT トランザクション)

  • SELECT

使用上の注意

  • Snowflakeのデータは、システム時間の正確な値とわずかに異なる可能性があるタイムスタンプによって識別されます。

  • TIMESTAMP または OFFSET の値は定数式でなければなりません。

  • TIMESTAMP の最小時間解像度はミリ秒です。

  • 要求されたデータがTime Travel保持期間(デフォルトは1日)を超えている場合、ステートメントは失敗します。

    さらに、要求されたデータがTime Travel保持期間内にあるが、履歴データが利用できない場合(保持期間が延長された場合など)、ステートメントは失敗します。

  • 履歴テーブルデータにアクセスする場合、現在のテーブルスキーマが使用されます(列、デフォルト値など)。

  • 履歴データには、現在のデータと同じアクセス制御要件があります。変更は遡及的に適用されます。

トラブルシューティング

エラーメッセージ: Time travel data is not available for table <テーブル名>

原因

場合によっては、これはタイムスタンプが期待される場所で文字列を使用することによって引き起こされます。

解決策

文字列をタイムスタンプにキャストします。

... AT(TIMESTAMP => '2018-07-27 12:00:00')               -- wrong
... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP)    -- right

select * from tab1 where c1 = 'This is a string', c2 = 10 and "Column 2" = 20;

特定のタイムスタンプを使用して、テーブルから履歴データを選択します。

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

5分前の時点でテーブルから履歴データを選択します。

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

テーブルから履歴データを選択しますが、指定したトランザクションによる変更は含まれません。

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

指定されたトランザクションから生じるテーブルデータの差を返します。

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;