Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在snowflake中将滑动窗口框架设置为介于1个跟随和无界跟随之间_Sql_Oracle_Snowflake Cloud Data Platform - Fatal编程技术网

Sql 如何在snowflake中将滑动窗口框架设置为介于1个跟随和无界跟随之间

Sql 如何在snowflake中将滑动窗口框架设置为介于1个跟随和无界跟随之间,sql,oracle,snowflake-cloud-data-platform,Sql,Oracle,Snowflake Cloud Data Platform,我需要将oracle sql转换为雪花sql 在oracle中,我有以下几点: last_value(my_table.my_col) Over(Partition BY my_table.my_col2, my_table.my_col3 Order By my_table.my_col4 range BETWEEN 1 Following AND UNBOUNDED Following) 如文档中所述,在雪花中 对于滑动框架,不支持范围,我必须使用行 所以我必须用这个: slidi

我需要将oracle sql转换为雪花sql

在oracle中,我有以下几点:

last_value(my_table.my_col) 
Over(Partition BY 
my_table.my_col2,
my_table.my_col3
Order By my_table.my_col4 
range BETWEEN 1 Following AND UNBOUNDED Following)
如文档中所述,在雪花中

对于滑动框架,不支持范围,我必须使用行

所以我必须用这个:

slidingFrame ::=
{
   ROWS BETWEEN <N> { PRECEDING | FOLLOWING } AND <N> { PRECEDING | FOLLOWING }
 | ROWS BETWEEN UNBOUNDED PRECEDING AND <N> { PRECEDING | FOLLOWING }
 | ROWS BETWEEN <N> { PRECEDING | FOLLOWING } AND UNBOUNDED FOLLOWING
}
但它抛出错误:“无效的窗口框架”

注:

我能行

last_value(my_table.my_col) 
Over(Partition BY 
my_table.my_col2,
my_table.my_col3
Order By my_table.my_col4 
rows BETWEEN CURRENT row AND UNBOUNDED Following)

无误

但是我需要下面的
1来获得相同的结果

你知道这是怎么回事吗


谢谢

您没有忽略
NULL
值,因此您的原始代码在我看来就像
lead()

lead(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
                            order by my_table.my_col4
                           )
不需要窗框。这应该可以在两个数据库中使用

编辑:

@诺思是对的。这是一个复杂的公式。对于不共享最终值的所有行,逻辑似乎是放入列的最后一个值。这看起来很奇怪,但相当于这个公式:

first_value(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
                                   order by my_table.my_col4 desc
                                  )
不同之处在于,它总是拾取列中的最后一个值。声明的代码返回最后一个值的
NULL
。因此,可能需要一个
案例

(case when rank() over (partition by my_table.my_col2, my_table.my_col3
                        order by my_table.my_col4 desc)  > 1 
      then first_value(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
                                              order by my_table.my_col4 desc
                                  )
 end)

是一个dbfiddle,使用Postgres接受这两个查询。

根据语法图,Snowflake应该支持这一点。解决方法<代码>第一个\u值。。。按col4 DESC行排序(在无界前一行和前一行之间)
也可能会失败。事实上,相同的错误“无效窗口框架”感谢Gordon,它在snowflake中工作,并给出与中的原始请求完全相同的结果oracle@CyriaquePin . . . 这也是在Oracle中编写代码的更简单方法。事实上,我猜原来的代码被修改了很多次,因为当前表单不需要windowing子句。它后面是最后一个值,因此它的结果与LEAD完全不同。事实上,它与当前行和无界后续行之间的值相同,只是最后一行返回NULL而不是实际值。它确实被修改了多次,而且这只是更大请求的一小部分。它不检查null,因为后面跟着“isnull”测试。我的工作只是将现有的oracle代码翻译成snowflake,而不是编写原始代码code@dnoeth . . . 非常感谢。我编辑了这个问题,并使用Postgres添加了一个dbfiddle,它支持这两个公式。
first_value(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
                                   order by my_table.my_col4 desc
                                  )
(case when rank() over (partition by my_table.my_col2, my_table.my_col3
                        order by my_table.my_col4 desc)  > 1 
      then first_value(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
                                              order by my_table.my_col4 desc
                                  )
 end)