通过事件获得最大的连胜纪录

时间:2018-12-12 03:44:08

标签: postgresql

我无法解决这个问题。

我正在寻找一个查询,如果可能的话,请在pgAdmin3 v1.22.1下运行PostgreSQL 9.6.6

我有一张表格,上面有一个日期,每个日期对应一个事件:

Date        Events
2018-12-10  1
2018-12-10  1
2018-12-10  0
2018-12-09  1
2018-12-08  0
2018-12-07  1
2018-12-06  1
2018-12-06  1
2018-12-06  1
2018-12-05  1
2018-12-04  1
2018-12-03  0

我正在寻找最长的日期序列,不要间断。在这种情况下,2018-12-082018-12-03是仅有的没有事件的日期,在2018-12-08today之间有两个带有事件的日期,在2018-12-8之间有四个日期和2018-12-07-所以我想要4的答案。

我知道我可以将它们与类似的东西分组在一起

Select Date, count(Date) from Table group by Date order by Date Desc

要获取最新的序列,我会遇到类似的情况-subquery返回没有事件的最新日期,外部查询会计算该日期之后的日期:

select count(distinct date) from Table
where date>
  ( select date from Table
    group by date
    having count (case when Events is not null then 1 else null end) = 0
    order by date desc
    fetch first row only)

但是现在我需要最长的条纹,而不仅仅是最近的条纹。

谢谢!

1 个答案:

答案 0 :(得分:1)

您的直觉是查看零事件行并加以解决的好本领。我们可以使用带有窗口函数的子查询来获取零事件日之间的“间隔”,然后在外部查询中获取我们想要的记录,如下所示:

select * 
from (
  select date as day_after_streak
   , lag(date) over(order by date asc) as previous_zero_date 
   , date - lag(date) over(order by date asc) as difference
   , date_part('days', date - lag(date) over(order by date asc) ) - 1 as streak_in_days
  from dates

  group by date
  having sum(events) = 0 ) t 
where t.streak_in_days is not null
order by t.streak_in_days desc
limit 1