如何计算一系列连续日期中的一天数?

How to calculate the number of a day in series of consecutive dates?

我有一个table

id name     created_at
1  name 1   08/01/2017
2  name 2   08/02/2017
3  name 3   08/03/2017
4  name 4   08/05/2017
5  name 5   08/06/2017
6  name 6   08/07/2017
7  name 7   08/10/2017
8  name 8   08/12/2017

我需要为所有行添加一个列,但如果它们是每天创建的。

结果应该如下所示

id name     created_at   days_on
1  name 1   08/01/2017   1
2  name 2   08/02/2017   2
3  name 3   08/03/2017   3
4  name 4   08/05/2017   1
5  name 5   08/06/2017   2
6  name 6   08/07/2017   3
7  name 7   08/10/2017   null
8  name 8   08/12/2017   null

many answers 描述了类似问题的典型方法,您还可以在其中找到对下面使用的技术的解释。

select 
    id, name, created_at, 
    case when count(*) over wa > 1 then row_number() over wo end as rank
from (
    select 
        id, name, created_at, 
        sum(first) over w as part
    from (
        select *, (lag(created_at) over w+ 1 is distinct from created_at)::int as first
        from my_table
        window w as (order by id)
        ) s
    window w as (order by id)
    ) s
window 
    wa as (partition by part),
    wo as (partition by part order by id);

DbFiddle.

这是群岛问题的变体。让我展示一个使用 lag() 定义组的解决方案:

  • lag()获取前一天
  • 累计求和得到分组
  • row_number() 分配最终值

这作为:

select id, name, created_at,
       (case when count(*) over (partition by grp) > 1
             then row_number() over (partition by grp order by id)
        end) as days_on
from (select t.*,
             sum( (prev_ca <> created_at - interval '1 day')::int ) as grp
      from (select t.*,
                   lag(created_at) over (order by id) as prev_ca
            from t
     ) t;