2010-12-12 7 views
5

j'ai une table de données avec les champs suivantsrequête MySQL - trouver « nouveaux » utilisateurs par jour

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

La requête a besoin de me dire comment ont eu lieu de nombreux événements avec de nouveaux noms d'utilisateurs pour chaque jour dans l'ensemble . Donc, pour chaque jour, combien d'événements existent qui ont un UserID qui n'existe pas dans les jours précédents. J'ai essayé beaucoup, et je peux obtenir des utilisateurs uniques par jour, mais je n'arrive pas à trouver comment obtenir de nouveaux utilisateurs par jour.

+2

Peut-on supposer que UserID est ** pas ** unique dans votre table d'événements? –

+0

Oui, désolé, c'est le cas. –

+0

Aussi, je semble avoir été peu clair. Ce dont j'ai besoin, c'est le nombre de nouveaux utilisateurs par jour - pas la quantité d'activité pour les nouveaux utilisateurs par jour - si cela a du sens? –

Répondre

1

Merci à tous pour votre aide - j'ai voté l'aide. Voici ce que j'ai fait:

J'ai créé ces 2 vues (j'avais besoin de finir avec une vue, et j'ai dû en créer 2 car il semble que vous ne pouvez pas imbriquer certaines instructions dans les vues).

: Sightings

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

Bonne question. Je n'ai pas de solution exacte mais voici l'approche que j'ai vu:

Faites un SELECT où vous comparez le EventTimeStamp avec MIN(EventTimeStamp) pour un ID utilisateur donné, comme déterminé par une instruction SELECT imbriquée sur la même table pour calculer l'horodatage MIN pour chaque ID (par exemple 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) comme new_users

+0

Je ne suis pas certain de comprendre cette réponse - qu'est-ce qui me manque? –

1

d'abord obtenir une table b avec pour chaque utilisateur quand il est arrivé, puis rejoindre cette table pour obtenir tous les événements pour que l'utilisateur pour ce jour-là.

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) 
Questions connexes