Categorias:

Sintaxe de consulta

AT | BEFORE

A cláusula AT ou BEFORE é usada para o Snowflake Time Travel. Em uma consulta, ela é especificada na cláusula FROM imediatamente após o nome da tabela e determina o ponto no passado do qual os dados históricos são solicitados para o objeto:

  • A palavra-chave AT especifica que a solicitação inclui quaisquer alterações feitas por uma instrução ou transação com um carimbo de data/hora igual ao parâmetro especificado.

  • A palavra-chave BEFORE especifica que o pedido se refere a um ponto imediatamente anterior ao parâmetro especificado.

Para obter mais informações, consulte Compreensão e uso do Time Travel.

Consulte também:

FROM

Sintaxe

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

Especifica uma data e hora exatas a serem usadas para o Time Travel. O valor deve ser convertido explicitamente em um TIMESTAMP.

OFFSET => time_difference

Especifica a diferença em segundos do tempo atual a ser usado para o Time Travel, na forma -N onde N pode ser uma expressão inteira ou aritmética (por exemplo, -120 é 120 segundos, -30*60 é 1800 segundos ou 30 minutos).

STATEMENT => id

Especifica a ID de consulta de uma instrução a ser usada como ponto de referência para o Time Travel. Este parâmetro oferece suporte a qualquer instrução de um dos seguintes tipos:

  • DML (por exemplo, INSERT, UPDATE, DELETE)

  • TCL (transação BEGIN, COMMIT)

  • SELECT

A ID da consulta deve fazer referência a uma consulta que tenha sido executada nos últimos 14 dias. Se a ID da consulta fizer referência a uma consulta com mais de 14 dias, o seguinte erro é retornado:

Error: statement <query_id> not found

Para contornar esta limitação, use o carimbo de data/hora para a consulta referenciada.

STREAM => 'name'

Especifica o identificador (ou seja, nome) de um fluxo existente na tabela ou exibição consultada. O offset atual no fluxo é usado como o ponto AT no tempo para retornar os dados de alteração para o objeto de origem.

Essa palavra-chave é suportada somente ao criar um fluxo (usando CREATE STREAM) ou ao consultar dados de modificação (usando a cláusula CHANGES). Para obter exemplos, consulte esses tópicos.

Notas de uso

  • Os dados em Snowflake são identificados por carimbos de data/hora que podem diferir um pouco do valor exato do tempo do sistema.

  • O valor para TIMESTAMP ou OFFSET deve ser uma expressão constante.

  • A menor resolução de tempo para TIMESTAMP é de milissegundos.

  • Se os dados solicitados estiverem além do período de retenção de Time Travel (o padrão é 1 dia), a instrução falha.

    Além disso, se os dados solicitados estiverem dentro do período de retenção do Time Travel, mas não houver dados históricos disponíveis (por exemplo, se o período de retenção foi prorrogado), a instrução falha.

  • Se o tempo do Time Travel especificado for no momento ou antes do momento em que o objeto foi criado, a instrução falha.

  • Ao acessar os dados históricos da tabela, os resultados incluem as colunas, os valores padrão etc. da definição atual da tabela. O mesmo se aplica a exibições não materializadas. Por exemplo, se você alterar uma tabela para adicionar uma coluna, a consulta de dados históricos antes do momento em que a coluna foi adicionada retornará resultados que incluem a nova coluna.

  • Os dados históricos têm os mesmos requisitos de controle de acesso que os dados atuais. Quaisquer alterações são aplicadas retroativamente.

Solução de problemas

Erro

Time travel data is not available for table <tablename>

Causa

Em alguns casos, isto é causado pelo uso de uma cadeia de caracteres onde é esperado um carimbo de data/hora.

Solução

Converter a cadeia de caracteres em um carimbo de data/hora.

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

Exemplos

Selecionar os dados históricos de uma tabela usando um carimbo de data/hora específico:

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

Selecionar dados históricos de uma tabela de 5 minutos atrás:

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

Selecionar dados históricos de uma tabela até, sem incluir, quaisquer alterações feitas pela transação especificada:

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

Retornar a diferença nos dados da tabela resultante da transação especificada:

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