【问题标题】:Determining continuity length of a sequence of dates in postgres在postgres中确定日期序列的连续性长度
【发布时间】:2017-02-24 17:44:26
【问题描述】:

在 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

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

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

    • 哦,那太可爱了。非常感谢!
    • 您需要在外部选择窗口中添加“按日期排序”。否则 col2 的值不会以正确的顺序递增。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2015-02-03
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多