2016-11-09 5 views
2

Ich arbeite an Abfrage, um kumulative Anzahl der UIDs auf täglicher Basis zu erhalten.Kumulative eindeutige Zählung

Beispiel: Angenommen, es sind 2 uids (100,200) am Datum 2016-11-01 erschienen und sie erschienen auch am nächsten Tag mit neuer uid 300 (100,200,300) am 2016-11-02 An dieser Stelle möchte ich kumulativ speichern zählen Sie als 3 nicht 5 als (Benutzer-ID 100 und 200 bereits am vergangenen Tag angezeigt).

Input table: 

    date   uid   
2016-11-01   100 
2016-11-01   200 
2016-11-01   300 
2016-11-01   400   
2016-11-02   100 
2016-11-02   200     
2016-11-03   300 
2016-11-03   400 
2016-11-03   500 
2016-11-03   600 
2016-11-04   700 

Expected query result: 

date   daily_cumulative_count 
2016-11-01    4 
2016-11-02    4 
2016-11-03    6 
2016-11-04    7 

Bis jetzt bin ich in der Lage, kumulative deutliche Anzahl pro Tag zu bekommen, aber es enthält vorherige eindeutige Uids vom vorherigen Tag.

SELECT 
    date, 
    SUM(count) OVER (
    ORDER BY date ASC 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 
) 
FROM (
    SELECT 
    date, 
    COUNT(DISTINCT uid) AS count 
    FROM sample_table 
    GROUP by 1 
)ORDER BY date DESC; 

Jede Art von Hilfe würde sehr geschätzt werden.

Antwort

1

Sie können exists verwenden, um zu überprüfen, ob zu einem der vorherigen Daten eine ID vorhanden war. Dann erhalten Sie die laufende Summe und finden Sie den maximalen Wert für jede Gruppe, die Sie die tägliche unterschiedliche kumulative Anzahl erhalten würde.

select dt, max(col) as daily_cumulative_count 
from (select t1.*, 
     sum(case when not exists (select 1 from t where t1.dt > dt and id = t1.uid) then 1 else 0 end) over(order by dt) col 
     from t t1) x 
group by dt 
1

Bitte versuchen Sie folgendes ...

SELECT date AS date 
     COUNT(uid) AS daily_cumulative_count 
FROM (SELECT leftTable.date AS date, 
       rightTable.uid AS uid 
     FROM sample_table AS leftTable 
     JOIN sample_table AS rightTable ON leftTable.date >= rightTable.date 
     GROUP BY leftTable.date, 
       rightTable.uid 
    ) AS allUIDSForDateFinder 
GROUP BY date; 

Diese Anweisung beginnt mit einer Instanz von sample_table zu einem anderen in einer solchen Art und Weise verbinden, dass jeder Datensatz in leftTable mit ihm eine Kopie jeder Datensatz zugeordnet ist, von rightTable, die einen früheren oder gleich date Wert hat. Dies fügt effektiv eine Liste an alle date aller uid Werte, die bis zu und einschließlich dieser date Wert aufgetreten sind.

Der resultierende Datensatz wird durch Verwendung von GROUP BY zu eindeutigen date und uid Kombinationen verfeinert.

Der verfeinerte Datensatz aus der Unterabfrage allUIDSForDateFinder wird dann durch date durch den Hauptkörper der Abfrage gruppiert und ein COUNT() von uid Werten mit jeder Gruppe verbunden ist, durchgeführt.

Wenn Sie irgendwelche Fragen oder Kommentare haben, dann zögern Sie nicht, einen Kommentar entsprechend zu posten.