假设我有一张表格如下:
user date
a 10/15/2015
a 11/15/2015
a 12/15/2015
a 2/15/2015
b 1/15/2015
b 2/15/2015
b 4/15/2015
b 6/15/2015
我需要创建三个列变量(实际上是两个 - 我计算了时滞变量)(1)按月计算连续登录次数,如果有失效则重新启动计数器(2)的天数在登录之间(计算出这一个)(3)如果计数器重置,则它们的循环计数增加1。结果表应如下所示:(为了说明的目的,我将在1个月的时间内使用30天。)
user date count timelapse cycle
a 10/15/2015 1 0 1
a 11/15/2015 2 30 1
a 12/15/2015 3 30 1
a 2/15/2015 1 60 2
b 1/15/2015 1 0 1
b 2/15/2015 2 30 1
b 4/15/2015 1 60 2
b 6/15/2015 1 60 3
有什么想法吗?我能够让计数列工作 - 但是当游戏中时光倒流大于30时我无法重置它。由于循环是以两列为条件的,我在那里有点亏。
非常感谢任何帮助或想法。
答案 0 :(得分:0)
这是个主意。使用lag()
确定何时出现间隙。您可以将日期截断到月初,以进行比较。
然后,做一个间隙标志的累积和。这提供了cycle
列。然后使用row_number()
:
cycle
select t.*,
row_number() over (partition by user, cycle order by date) as count
from (select t.*, sum(IsGap) over (partition by user order by date) as cycle
from (select user, date,
(case when date_trunc('month', date) = date_trunc('month', lag(date) over (partition by user order by date) + interval '1 month'
then 0
else 1
end) as IsGap
from t
) t
) t