在雪花时间旅行sql中使用动态值

Posted

技术标签:

【中文标题】在雪花时间旅行sql中使用动态值【英文标题】:Use dynamic value in snowflake time travel sql 【发布时间】:2019-11-30 23:16:42 【问题描述】:

我想在雪花的时间旅行sql中使用动态值

select * from my_table at (timestamp => (select max(COMPLETION_DATE) from my_table_2):: timestamp)

【问题讨论】:

您能否对您所看到的内容进行说明?就像您遇到的任何错误一样。 【参考方案1】:

当我运行类似的东西时,我得到了这个错误:

SQL compilation error: argument TIMESTAMP to function AT needs to be constant

我相信一个变量可以解决这个问题:

set x = (select max(COMPLETION_DATE)::timestamp from my_table_2);

select * from my_table at (timestamp => $x);

编辑视图

我认为您不能一蹴而就,但您可以使用 UDF 做类似的事情。请参阅此处的文档:https://docs.snowflake.net/manuals/sql-reference/udf-table-functions.html

类似这样的:

create or replace function My_timetravel()
  returns table (column1 varchar, column2 numeric(11, 2))
  as
  $$
        set x = (select max(COMPLETION_DATE)::timestamp from my_table_2);

        select column1, column2 from my_table at (timestamp => $x);
  $$
  ;

select * from table(My_timetravel());

【讨论】:

谢谢。实际上,我想根据 my_table_2 中的特定时间戳值在 my_table1 上创建一个视图。在这种情况下,变量选项将不起作用 嗯。我想不出一种在视图中执行此操作的方法,但是 UDF 可能可以为您提供所需的内容。不过,我必须更多地了解您想要的输入和输出。 docs.snowflake.net/manuals/sql-reference/… 编辑了与您的用例相关的 UDF 示例。今晚我无法为此设置一个完整的测试环境,所以你肯定不得不摆弄它。【参考方案2】:

时间旅行只能用一个常数来指定,这使得我无法参数化(目前)。

执行此操作的唯一方法是通过存储过程,您可以在其中以文本形式提供查询。I answered a similar question some days ago 使用此过程:

CREATE OR REPLACE PROCEDURE TIME_TRAVEL(QUERY TEXT, DAYS FLOAT)
RETURNS VARIANT LANGUAGE javascript AS
$$
  function run_query(query, offset) 
    try 
      var sqlText = query.replace('"at"', " AT(OFFSET => " + (offset + 0) + ") ");
      return (snowflake.execute(sqlText: sqlText)).next();
    
    catch(e)  return false 
  
  var days, result = [];
  for (days = 0; days < DAYS; days++)
    if (run_query(QUERY, -days * 86400)) result.push(days);
  return result;
$$;

CALL TIME_TRAVEL('SELECT * FROM TASK_HISTORY "at" WHERE QUERY_ID = ''019024ef-002e-8f71-0000-05e10030a782''', 7);

【讨论】:

【参考方案3】:

Snowflake 中的会话变量可以与查询替换一起使用,并有助于您的时间旅行查询的时间戳子句。目前,UDF 中不支持此功能,因此您需要声明会话变量,然后将其与您的 UDF 一起使用:

SET x = (SELECT current_timestamp());
CREATE OR REPLACE FUNCTION my_timetravel()
    RETURNS TABLE (c1 int)
    AS
    $$
        SELECT c1 FROM t1 AT (TIMESTAMP => $x)
    $$
    ;

从表中选择 c1(my_timetravel());

【讨论】:

当然,但为了自动化任何非恒定时间旅行,您必须[暂时]使用存储过程。 顺便说一句,很高兴看到可以从表达式中设置 SQL 变量。这是全新的,还是我错过了任何公告?文档没有表达式示例...

以上是关于在雪花时间旅行sql中使用动态值的主要内容,如果未能解决你的问题,请参考以下文章

如何验证雪花时间旅行设置?

雪花传递动态值绑定和常量值

在 python 中执行雪花 SQL 语句时出现雪花 python 错误

在雪花中创建具有动态日期范围的日历表

Android 中用于显示已旅行位置的动态编程

CREATE OR REPLACE 语句会影响雪花的时间旅行吗?