Если вы создадите таблицу календаря с одной строкой для каждой недели, вы сможете решить свою проблему с помощью запроса, подобного следующему:
SELECT userid
FROM (SELECT userid,
YEARWEEK(TIMESTAMP) AS year_week,
COUNT(DISTINCT DAYOFWEEK(TIMESTAMP)) AS check_in_days
FROM checkins
WHERE 1 = 1 -- This would be your date range filter
GROUP BY userid,
YEARWEEK(TIMESTAMP)
HAVING check_in_days BETWEEN 3 AND 5) AS user_weeks
GROUP BY userid
HAVING COUNT(year_week) = (SELECT COUNT(*)
FROM year_week
WHERE 1 = 1 -- This would be your date range filter
);
(Моя таблица недели имеет одну строку для каждой неделимежду 2001 и 2020 годами.)
Внутренний запрос (user_weeks) возвращает одну строку для каждого {user_id, week}, где пользователь регистрировался не менее 3 дней или не более 5 дней в этой конкретной неделе.(Количество проверок за один день не имеет значения).Внешний запрос возвращает одну строку для каждого {user_id} вместе с количеством недель, которые удовлетворяют установленному требованию 3-5 дней.Условие «Наличие» во внешнем фильтре выбора включает результаты только тех пользователей, которые зарегистрировались столько раз (недель), сколько и фактических недель в вашем диапазоне дат.Это должно учитывать требование «последовательных» недель.
Дайте мне знать, поможет ли это вам.
Редактировать Изменено с функции week () на yearweek ().