Wenn Sie einen Kalender Tabelle mit einer Zeile für jede Woche erstellt haben, sollten Sie in der Lage sein, Ihr Problem wie dieses mit einer Abfrage zu lösen:
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
);
(Meine Woche Tabelle hat hier eine Zeile für jede Woche zwischen Jahre 2001 und 2020.)
Die innere Abfrage (user_weeks) gibt eine Zeile für jede {user_id, week} zurück, in der der Benutzer mindestens 3 Tage oder höchstens 5 Tage in dieser bestimmten Woche eingecheckt hat. (Nr Checkins pro Tag ist egal). Die äußere Abfrage gibt eine Zeile für jede {user_id} zurück, zusammen mit der Anzahl der Wochen, die die eingecheckte Anforderung von 3-5 Tagen erfüllt haben. Die having-Klausel im äußeren Auswahlfilter bewirkt, dass das Ergebnis nur Nutzer enthält, die so oft (Wochen) eingecheckt haben, wie die Anzahl der tatsächlichen Wochen in Ihrem Datumsbereich. Dies sollte die Anforderung "aufeinanderfolgender Wochen" erfüllen.
Lassen Sie mich wissen, ob dies Ihnen hilft.
Bearbeiten Geändert von Funktionswoche() zu Yearweek().
Tragen Sie jeden Tag in diese Tabelle für jeden Benutzer ein? –
Es können mehrere Einträge desselben Benutzers für einen Tag sein. – Pentium10