我很难缠这个头。这是我所拥有的:
user_id | year
1 | 2015
1 | 2016
1 | 2018
1 | 2019
1 | 2020
2 | 2015
2 | 2016
2 | 2017
2 | 2018
2 | 2019
我需要的是结果:
user_id | count
1 | 3
2 | 5
因此,对于每个用户,我需要知道最长的连续条纹,并且没有基于年份的差异。用户1在2017年有缺口,因此最长的连胜是2018-2020年。用户2没有休息时间,因此连续5年。我想确保所有间隙都可以从本质上重置计数。我已经找到了许多用于日期计数的解决方案,但我似乎找不到一个用于递增整数值的解决方案,它本质上必须是序列中的下一个,而不仅仅是更大。我希望有一个聪明的MySQL兼容查询。
这里是一种方法。减去序列号-对于连续值恒定。然后聚合并拉出最长的一个:
select t.*
from (select user_id, count(*) as streak_length,
min(year) as min_year, max(year) as max_year,
row_number() over (partition by user_id order by count(*) desc) as seqnum
from (select t.*,
row_number() over (partition by user_id order by year) as seqnum
from t
) t
group by user_id, year - seqnum
) t
where seqnum = 1;