SQL запрос, чтобы найти максимальное количество посещаемых событий пользователем в год - PullRequest
1 голос
/ 10 марта 2020

Мне тяжело оборачиваться вокруг этого. Вот что у меня есть:

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 совместимый запрос.

1 Ответ

3 голосов
/ 10 марта 2020

Вот один из методов. Вычтите порядковый номер - который является постоянным для последовательных значений. Затем соберите и вытащите самое длинное:

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;
...