我无法解决这个问题。
我正在寻找一个查询,如果可能的话,请在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-08
和2018-12-03
是仅有的没有事件的日期,在2018-12-08
和today
之间有两个带有事件的日期,在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)
但是现在我需要最长的条纹,而不仅仅是最近的条纹。
谢谢!
答案 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