sql - 如何将滑动窗框设置为雪花中 1 Following 和 UNBOUNDED Following 之间的范围

标签 sql oracle snowflake-cloud-data-platform

我需要将 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/

相关文章:

php - Laravel orderby 分数/日期(作为分数)

oracle - 自定义登录后重定向功能 Post_Login

sql - Oracle 模式表行数

mysql更新语句意外更新

sql - 根据列过滤掉行中的重复项

mysql - 将 MySQL 函数转换为 Oracle PL/SQL

snowflake-cloud-data-platform - 如何检查雪花表是否启用了 CHANGE_TRACKING?

snowflake-cloud-data-platform - 你如何从不同的年龄组中选择一些随机行?

snowflake-cloud-data-platform - 如何在 Snowflake 中将 MultiPoint 转换为 LineString?

java - 我可以使用什么可能的模式来存储单词组合?