如何设置滑动窗口框架之间的范围1以下和无界以下的雪花

c2e8gylq  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(265)

我需要将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 得到同样的结果。
你知道这是怎么回事吗?
谢谢

gwbalxhn

gwbalxhn1#

你没有忽视 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 可能需要:

(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)

这里有一个db<>fiddle,使用postgres,它接受两个查询。

相关问题