我之前已经发布了与此类似的问题,但是参数的更新意味着发布的解决方案将无法正常工作,而且我在尝试解决如何整合修订后的要求方面遇到了麻烦。我不确定此处的协议-似乎无法在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-08
和2018-12-03
是仅有的没有事件的日期,在2018-12-08
和today
之间有两个带有事件的日期,在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
但是现在我需要最长的条纹,而不仅仅是最近的条纹。
我以前发布时曾假设范围内每个日期都有行。但是这个假设是不正确的,因此给出的答案不起作用。我还需要查询返回该范围的开始和结束日期。
谢谢!
答案 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;