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;