Es klingt zu holen, wie Sie eine Nummer für jede einzelne action_date
in der Tabelle benötigen.
Zuerst benötigen Sie eine virtuelle Tabelle mit den Aktionsterminen.
SELECT DISTINCT action_date FROM Table_1
Dann müssen Sie diese virtuelle Tabelle zu Ihrer ursprünglichen Tabelle in einer Art und Weise verbinden, die die 30-Tage aussucht Bereiche:
SELECT a.action_date, b.user_id
FROM (
SELECT DISTINCT action_date FROM Table_1
) a
LEFT JOIN Table_1 b ON b.action_date >= a.action_date - INTERVAL 29 DAY
AND b.action_date <= a.action_date
Dann Sie dieses Ergebnis aggregieren müssen. mit dem strukturierten Aspekt Structured Query Language
SELECT a.action_date, COUNT(DISTINCT b.user_id) user_count
FROM (
SELECT DISTINCT action_date FROM Table_1
) a
LEFT JOIN Table_1 b ON b.action_date >= a.action_date - INTERVAL 29 DAY
AND b.action_date <= a.action_date
GROUP BY a.action_date
ORDER BY a.action_date
Ich habe dies in der Hoffnung, Schritt für Schritt ausgeschrieben werden Sie sehen, wie Sie Ihre Abfrage erstellen.
Es ist auch hilfreich, wenn Sie eine solche Abfrage schreiben, um jeden Schritt auf dem Weg zu beheben. Wenn Sie das Ganze ausschreiben, kann es ziemlich schwierig sein, Probleme zu finden.
(- INTERVAL 29 DAY
? Sie fragte nach einem 30 Tage-Bereich. Ich das Datum in Frage aufgenommen haben und den 29 Tagen vor dem Spiel.)
Beachten Sie, dass, wenn Ihr action_dates DATETIME
Artikel waren, müssten Sie machen ein paar Änderungen.
SELECT DATE(a.action_date) action_date,
COUNT(DISTINCT b.user_id) user_count
FROM (
SELECT DISTINCT DATE(action_date) action_date FROM Table_1
) a
LEFT JOIN Table_1 b ON b.action_date >= a.action_date - INTERVAL 29 DAY
AND b.action_date < a.action_date + INTERVAL 1 DAY
GROUP BY DATE(a.action_date)
ORDER BY DATE(a.action_date)
Beachten Sie, wie der Datumsbereich, wenn Sie DATETIME
Elemente verwenden, bis er läuft, aber nicht einschließlich (<
), Mitternacht am Tag nach dem Enddatum (action_date + INTERVAL 1 DAY
).
Welche Ausgabe erhalten Sie von dieser Abfrage? –