Sql 如何在snowflake中将滑动窗口框架设置为介于1个跟随和无界跟随之间
我需要将oracle sql转换为雪花sql 在oracle中,我有以下几点: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
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)