确定postgres中一系列日期的连续性长度

时间:2017-02-24 17:44:27

标签: sql postgresql date gaps-and-islands gaps-in-data

是否有直接的方法来确定Postgres中一系列日期的连续性长度?

为简单起见,我可以说我有一个日期表,如下所示:

2017-01-01
2017-01-02
2017-01-03
2017-01-04
2017-01-06
2017-01-08
2017-01-09

对于每个日期,我想知道它在连续日期序列中的计数。所以我想要:

2017-01-01 1
2017-01-02 2
2017-01-03 3
2017-01-04 4
2017-01-06 1
2017-01-08 1
2017-01-09 2

我想我需要使用一个过程并循环游标以保持计数,但是想知道是否有更聪明的方法?我花了一些时间查看窗口函数,但没有看到任何适合该法案的东西。

1 个答案:

答案 0 :(得分:1)

您可以通过减去序号来识别序列。然后,常数值表示序列。在此之后,您的枚举是row_number()

的应用程序
select t.date,
       row_number() over (partition by date - seqnum * interval '1 day' order by date) as col2
from (select t.*,
             row_number() over (order by date) as seqnum
      from t
     ) t;