在另一个变量postgreSQL的滞后条件下生成循环列变量

时间:2016-04-08 01:51:41

标签: sql postgresql

假设我有一张表格如下:

    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时我无法重置它。由于循环是以两列为条件的,我在那里有点亏。

非常感谢任何帮助或想法。

1 个答案:

答案 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