通过事件获得最大的连胜纪录-更新的问题

时间:2018-12-17 03:22:08

标签: sql postgresql

我之前已经发布了与此类似的问题,但是参数的更新意味着发布的解决方案将无法正常工作,而且我在尝试解决如何整合修订后的要求方面遇到了麻烦。我不确定此处的协议-似乎无法在Getting maximum sequential streak with events

的原始帖子中发布更新的问题

我正在寻找一个查询,如果可能的话,请在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-08  0
    2018-12-07  1
    2018-12-06  1
    2018-12-06  1
    2018-12-06  0
    2018-12-06  1
    2018-12-04  1
    2018-12-03  0

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

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

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

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

select date, 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)
group by date

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

我以前发布时曾假设范围内每个日期都有行。但是这个假设是不正确的,因此给出的答案不起作用。我还需要查询返回该范围的开始和结束日期。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过对0进行累计计数来分配组。然后计算每组中的不同日期:

select count(*), min(date), max(date), count(distinct date)
from (select t.*,
             count(*) filter (where events = 0) over (order by date) as grp
      from t
     ) t
group by grp
order by count(distinct date) desc
limit 1;