MySQL:如何找到特定值的不间断序列的最大长度?

MySQL:如何找到特定值的不间断序列的最大长度?,mysql,sql,Mysql,Sql,给出一张表格: date value 02.10.2019 1 03.10.2019 2 04.10.2019 2 05.10.2019 -1 06.10.2019 1 07.10.2019 1 08.10.2019 2 09.10.2019 2 10.10.2019 -1 11.10.2019 2 12.10.2019 1 在那个例子中,如何找到正数4的不间断序列的最大长度?这是一个缺口和孤岛问题。一种简单的方法是通过行号的差异来识别岛屿: select mi

给出一张表格:

date        value
02.10.2019  1
03.10.2019  2
04.10.2019  2
05.10.2019 -1
06.10.2019  1
07.10.2019  1
08.10.2019  2
09.10.2019  2
10.10.2019 -1
11.10.2019  2
12.10.2019  1

在那个例子中,如何找到正数4的不间断序列的最大长度?

这是一个缺口和孤岛问题。一种简单的方法是通过行号的差异来识别岛屿:

select min(date), max(date), count(*) as length
from (select t.*,
             row_number() over (order by date) as seqnum_1,
             row_number() over (partition by sign(value) order by date) as seqnum_2
      from t
     ) t
group by sign(value), (seqnum_1 - seqnum_2)
order by count(*) desc
limit 1;
这有点难以解释。我发现,如果你盯着子查询的结果看,你会发现差异是如何识别组的

假设日期之间没有间隔,另一种方法会查找下一个非正数(如果有):

select t.*,
       datediff(date, coalesce(next_end_date, max_date)) as num
from (select t.*,
             min(case when value <= 0 then date end) over (order by date desc) as next_end_date,
             max(date) over () as max_date
      from t
     ) t
where value > 0
order by datediff(date, coalesce(next_end_date, max_date)) desc
limit 1;

这是一个缺口和孤岛问题。一种简单的方法是通过行号的差异来识别岛屿:

select min(date), max(date), count(*) as length
from (select t.*,
             row_number() over (order by date) as seqnum_1,
             row_number() over (partition by sign(value) order by date) as seqnum_2
      from t
     ) t
group by sign(value), (seqnum_1 - seqnum_2)
order by count(*) desc
limit 1;
这有点难以解释。我发现,如果你盯着子查询的结果看,你会发现差异是如何识别组的

假设日期之间没有间隔,另一种方法会查找下一个非正数(如果有):

select t.*,
       datediff(date, coalesce(next_end_date, max_date)) as num
from (select t.*,
             min(case when value <= 0 then date end) over (order by date desc) as next_end_date,
             max(date) over () as max_date
      from t
     ) t
where value > 0
order by datediff(date, coalesce(next_end_date, max_date)) desc
limit 1;