我需要将oracle sql转换为snowflake sql。
在甲骨文中,我有:
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)
像文件上写的那样https://docs.snowflake.com/en/user-guide/functions-window-using.htmlhttpshttp://docs.snowflake.com/en/sql-reference/functions-analytic.html
对于滑动框架,范围不受支持,我必须使用行
所以我得用这个:
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 1 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)
以及
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 1 PRECEDING AND UNBOUNDED Following)
没有错误
但我需要那个 1 following
得到同样的结果。
你知道这是怎么回事吗?
谢谢
1条答案
按热度按时间gwbalxhn1#
你没有忽视
NULL
值,使原始代码看起来像lead()
对我来说:不需要窗框。这应该在两个数据库中都适用。
编辑:
@dnoeth是正确的。这是一个复杂的公式。对于不共享最终值的所有行,逻辑似乎是放入列的最后一个值。这看起来很奇怪,但相当于这个公式:
不同的是,它总是选取列中的最后一个值。声明的代码返回
NULL
最后一个值。所以,一个case
可能需要:这里有一个db<>fiddle,使用postgres,它接受两个查询。