雪花能否做条件窗口函数,或以任何方式解决这个有趣的问题

时间:2019-05-21 01:58:17

标签: window-functions snowflake

使用窗口函数的典型雪花查询不是很难,例如,我想为每个用户在每个日期计数过去3条记录(不包括当前行)中按日期排序的1。我只是抽象这个问题,最初它可能是一个商品兑换研究,其中0/1表示是否兑换了,我想查看过去3次兑换次数,但查询日期除外。利用运行中的窗口可以达到此目的,基本上,我们将针对01-01看01-01、02-01和03-01,依此类推

user_id | reward_status | date
1001       1              2018-01-01
1001       0              2018-02-01
1001       0              2018-03-01
1001       1              2018-04-01
1002 ...

我的简单查询就这样顺利进行,对于2018-04-01,它给我1(01-01为1,而02-01和03-01为0)

select
user_id,
date,
coalesce(
sum(reward_status) over (
 partition by user_id
 order by date
 rows between 3 preceding and 1 preceding
  ), 0) as total_ones

from tables

但是,在某些情况下,请注意以下示例中有两天的时间都为2018-03-01。并使用与上面相同的查询,尽管我们使用“ 1前面”,但是第二个2018-03-01将考虑第一个2018-03-01,基本上1的偏移量不会像我希望的那样删除当前查询日期

user_id | reward_status | date
1001       1              2018-01-01
1001       0              2018-02-01
1001       0              2018-03-01
1001       1              2018-03-01

在此特定行中,我们想跳到以上两行,即,将查询从“ 3个在前和1个在前”更改为“ 4个在先和2个在前”,但这为每行引入了条件窗口,例如第一行3行中有1个在前,而第4行中有2个在前

但是,似乎window函数只能为offset参数接受一个常量。雪花是否具有可以完成此工作的某些功能?本质上,我想在每行上都有一个移动的窗口段,但是移动的偏移量是一个有条件的参数(对于该参数,我可以轻松地生成一个额外的列,但是据我测试,窗口大小/偏移量只能是一个常数)。

谢谢。

0 个答案:

没有答案