2010-11-30 4 views
2

J'essaie de représenter graphiquement les utilisateurs actifs dans une application web. Ma base de données se compose de deux tables principales, user et task. task a un user_id.Requête SQL des utilisateurs actifs

Ma définition de utilisateurs actifs: est un utilisateur qui a créé plus de 2 tâches dans les deux semaines une date de fin donnée. J'ai donc besoin d'une requête SQL qui me donne le nombre d'utilisateurs actifs entre une date de début et une date de fin données. J'ai été capable de le faire en mettant la requête dans une boucle, en tirant les résultats à chaque fois, mais j'aimerais pouvoir le faire en une seule requête.

Les données retournées doivent être quelque chose comme:

Date   Count 
2010-01-01 4 
2010-01-02 3 
2010-01-03 5 

Modifier pour clarifier ensemble de données désiré.

Répondre

1

A GROUP BY avec une clause HAVING devrait être suffisant pour obtenir tous les utilisateurs

SELECT u.user_id 
FROM user u 
     INNER JOIN task t ON t.user_id = u.user_id 
WHERE date BETWEEN DATEADD(week, -2, <EndDate>) AND <EndDate> 

GROUP BY 
     u.user_id 
HAVING COUNT(*) > 1 

et pour obtenir le nombre total envelopper dans une autre déclaration

SELECT COUNT(*) 
FROM (
     SELECT u.user_id 
     FROM user u 
       INNER JOIN task t ON t.user_id = u.user_id 
     WHERE date BETWEEN DATEADD(week, -2, <EndDate>) AND <EndDate> 
     GROUP BY 
       u.user_id 
     HAVING COUNT(*) > 1 
     ) u 

Modifier

Correction de l'exigence de 2 semaines en utilisant le code posté par Joe.

+0

Je pense que vous devez modifier la « date ENTRE ET » pour correspondre à la condition "dans les 2 semaines" à part ça ça marchera. –

+0

+1 très agréable. J'ai fixé votre lien HAVING –

+0

@Conrad, merci, apprécié. –

2
SELECT t.taskdate, COUNT(DISTINCT u.user_id) 
    FROM user u 
     INNER JOIN task t 
      ON u.user_id = t.user_id 
       AND t.taskdate BETWEEN DATE_ADD(@EndDate, INTERVAL -2 WEEK) AND @EndDate 
    GROUP BY t.taskdate 
    ORDER BY t.taskdate 
+0

Il veut un nombre d'utilisateurs, je pense ... – JNK

+0

et +1 pour l'édition :) – JNK

+0

@JNK: réponse éditée. Merci. –

0

Ceci n'est pas pour mysql mais cela pourrait fonctionner (je ne suis pas sûr de task_date + 14).

select * 
from user u 
where (select count(*) form task t where t.user_id = u.user_id and t.task_date + 14 > @end_date) > 2 

La requête interne select count... obtient les tâches pour l'utilisateur qui ont été créés 14 jours ou moins avant la date_fin donné

Questions connexes