2010-12-12 11 views
5

Ho una tabella di dati con i seguenti campiquery MySQL - trovare "nuovi" utenti al giorno

EventID  : Int, AutoIncrement, Primary Key 
EventType  : Int        ' Defines what happened 
EventTimeStamp : DateTime      ' When the Event Happened 
UserID   : Int        ' Unique 

La query ha la necessità di dirmi come molti eventi si sono verificati con nuove UserIDs per ogni giorno in tutto il set . Quindi, per ogni giorno, quanti eventi esistono che hanno un ID utente che non esiste in nessun giorno precedente. Ho provato un sacco, e posso ottenere utenti unici al giorno, ma non riesco a capire come ottenere "NUOVI" utenti al giorno.

+2

Ti possiamo supporre che UserID è ** non ** unico nella vostra tabella di eventi? –

+0

Sì, mi dispiace, questo è il caso. –

+0

Inoltre, sembra che non sia stato chiaro. Quello di cui ho bisogno è il numero di nuovi utenti al giorno - non la quantità di attività per i nuovi utenti al giorno - se ciò ha senso? –

risposta

1

Grazie a tutti per il vostro aiuto - Ho votato l'assistenza. Ecco cosa ho fatto:

Ho creato queste 2 viste (avevo bisogno di finire con una vista, e ho dovuto creare 2 come sembra che non sia possibile annidare le istruzioni selezionate all'interno delle viste).

avvistamenti:

select min(to_days(`Events`.TimeStamp)) AS Day0, 
    `Events`.TimeStamp AS TimeStamp, 
    `Events`.UserID AS UserID 
from `Events` group by `Events`.UserID order by `Events`.UserID 

newusers:

select count(distinct Sightings.UserID) AS Count, 
    date(Sightings.TimeStamp) AS Date from Sightings 
    group by date(Sightings.TimeStamp) 
1

Buona domanda. Non ho una soluzione esatta ma ecco l'approccio che ho visto prima:

Fai un SELECT dove confronti lo EventTimeStamp con MIN(EventTimeStamp) per un dato ID utente, come determinato da un'istruzione SELECT nidificata sulla stessa tabella per calcolare il timestamp MIN per ciascun ID (ad es. GROUP BY UserID).

1
Select count(EventId) from table 
where 
UserId 
    not in (select UserId from table where EventTimeStamp < now() - interval 1 day) 
0

86400- (EventTimeStamp) come new_users

+0

Non sono sicuro di aver capito questa risposta - cosa mi manca? –

1

Prima ottenere un tavolo con b per ogni utente quando è arrivato, poi join che tabella per ottenere tutti gli eventi per l'utente per quel giorno.

SELECT DATE(a.EventTimeStamp), COUNT(*) FROM table a 
JOIN 
(SELECT MIN(EventTimeStamp) AS EventTimeStamp, UserID from table group by userID) b 
ON a.UserID = b.UserID 
AND DATE(a.EventTimeStamp) = DATE(b.EventTimeStamp) 
GROUP BY DATE(a.EventTimeStamp) 
Problemi correlati