我需要将 oracle sql 转换为雪花 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.html https://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 以下
才能获得相同的结果。
你知道这里发生了什么吗?
谢谢
最佳答案
您没有忽略 NULL
值,因此您的原始代码对我来说看起来像 lead()
:
lead(my_table.my_col) over (partition by my_table.my_col2, my_table.my_col3
order by my_table.my_col4
)
不需要窗框。这应该适用于两个数据库。
编辑:
@dnoeth 是正确的。这是一个复杂的公式。对于不共享最终值的所有行,逻辑似乎是放入列的最后一个值。这看起来很奇怪,但相当于这个公式:
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)
Here是一个 db<>fiddle,使用 Postgres 接受两个查询。
关于sql - 如何将滑动窗框设置为雪花中 1 Following 和 UNBOUNDED Following 之间的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62039927/