SQL查询以查找用户给定年份的最大出席事件数

问题描述 投票:1回答:1

我很难缠这个头。这是我所拥有的:

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兼容查询。

mysql sql sequence gaps-and-islands
1个回答
3
投票

这里是一种方法。减去序列号-对于连续值恒定。然后聚合并拉出最长的一个:

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;
© www.soinside.com 2019 - 2024. All rights reserved.