- Categorias:
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:
Sintaxe¶
SELECT ...
FROM ...
{
AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) |
BEFORE( STATEMENT => <id> )
}
[ ... ]
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
ondeN
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
|
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);SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));
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';
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');
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;