使用窗口函数的典型雪花查询不是很难,例如,我想为每个用户在每个日期计数过去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参数接受一个常量。雪花是否具有可以完成此工作的某些功能?本质上,我想在每行上都有一个移动的窗口段,但是移动的偏移量是一个有条件的参数(对于该参数,我可以轻松地生成一个额外的列,但是据我测试,窗口大小/偏移量只能是一个常数)。
谢谢。