首页 > 解决方案 > 通过事件获得最大连续连续性 - 更新的问题

问题描述

我之前已经发布了一个类似的问题,但是参数的更新意味着发布的解决方案不起作用,我在尝试解决如何集成修改后的要求时遇到了麻烦。我不确定这里的协议 - 看来我无法在获取事件的最大连续连续性中将更新的问题发布到原始帖子

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

我有一个表格,其中包含日期和日期的每个事件的一行:

    日期事件
    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-08and2018-12-03是唯一没有事件的日期,有两个日期在2018-12-08and之间today,三个在2018-12-8and之间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

但现在我需要最长的连胜纪录,而不仅仅是最近的连胜纪录。

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

谢谢!

标签: sqlpostgresql

解决方案


您可以通过对 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;

推荐阅读