2016-04-26 6 views
1

ich eine einfache Tabelle, die von User_id besteht, action_dateDistinct Counting über Zeit

user_id action_date 
user_001 2016-04-15 
user_002 2016-04-15 
user_003 2016-04-15 
user_002 2016-04-15 
user_001 2016-04-15 
user_004 2016-04-16 
user_005 2016-04-16 
user_001 2016-04-16 
user_001 2016-04-16 
user_001 2016-04-16 

und für jeden action_date in der Datenbank muss ich überprüfen, wie viele verschiedene Nutzer im Zeitraum von 30 aktiv waren Tage, die von diesem action_date zurückzählen.

Ich weiß, ich muss 30 Tage für jedes action_date zurückgehen und verschiedene aktive Benutzer in diesem Zeitraum berechnen, habe ich so etwas versucht, aber es funktioniert nicht als intendent, wie Ich brauche eindeutige Zählung für alle 30 Tage Zeitablauf action_date.

SELECT action_date, COUNT (DISTINCT user_id) from Table_1 where user_id IN 
(SELECT user_id from Table_1 
WHERE action_date Between DATEADD(day,-30,action_date) and action_date) 
GROUP BY action_date 
+0

Welche Ausgabe erhalten Sie von dieser Abfrage? –

Antwort

0
SELECT action_date, COUNT (DISTINCT user_id) from Table_1 where 
action_date Between DATEADD(day,-30,action_date) and action_date 
GROUP BY action_date 

die obige Abfrage genügt, um die Ergebnisse

0

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