2009-04-28 7 views
2

J'ai une table de rapports qui a ces domaines pertinents:enregistrements de comptage d'une requête groupée avec des critères supplémentaires

user_id (int 11) 
submitted_date (datetime) 
approved_flag (shortint 1) 

Il y a plusieurs lignes par user_id, certaines avec approved_flag = 0 et quelques-uns avec approved_flag = 1 et chacun avec un submitted_date unique.

J'ai besoin d'obtenir le nombre de rapports approuvés et non approuvés. Mais je veux seulement compter le plus récent rapport soumis par utilisateur (le plus récent submitted_date), indépendamment de approved_flag.

Donc, s'il y avait 4 dossiers comme celui-ci:

 
    user_id, submitted_date, approved_flag 
    1, 2009-04-01 01:00, 1 
    1, 2009-04-01 02:00, 0 
    1, 2009-04-01 03:00, 1 (using this record) 
    2, 2009-04-02 01:00, 1 (using this record) 

le nombre serait 2 approuvé et pas non approuvé, et si nous avions

 
    user_id, submitted_date, approved_flag 
    1, 2009-04-01 01:00, 1 
    1, 2009-04-01 02:00, 0 
    1, 2009-04-01 03:00, 0 (using this record) 
    2, 2009-04-02 01:00, 0 
    2, 2009-04-02 02:00, 1 (using this record) 

le nombre serait 1 approuvé (utilisateur id 2) et 1 non approuvé (id utilisateur 1). Pour résumer une fois de plus parce que ce n'est pas facile à décrire: Je veux le nombre total d'utilisateurs uniques dans la table (sans tenir compte de # lignes par utilisateur) et je veux qu'il soit décomposé en 'approuvé' et 'non approuvé »basé sur le approved_flag du rapport le plus récent par utilisateur.

Toute aide serait grandement appréciée, merci!

+0

Je comprends bien que vous n'auriez jamais un nombre supérieur à un (par utilisateur)? et que vos comptes approuvés + non approuvés ne seraient jamais supérieurs à un (par utilisateur)? –

Répondre

1
SELECT approved_flag, COUNT(*) 
FROM 
    Table t 
    INNER JOIN (
    SELECT user_id, submitted_date = MAX(submitted_date) 
    FROM Table 
    GROUP BY user_id 
) latest ON latest.user_id = t.user_id 
       AND latest.submitted_date = t.submitted_date 
GROUP BY approved_flag 
+0

Qu'est-il arrivé à l'ID utilisateur? –

+0

Merci Lieven, ça me donne exactement ce que je cherchais! –

+0

@Jonathan, l'id_utilisateur n'était requis que dans la sélection interne pour obtenir la dernière date soumise par user_id et pouvoir se joindre à la sélection externe. Pour le résultat final, il n'y avait pas de user_id requis. –

0
SELECT user_id, approved_flag, COUNT(*) 
FROM reports 
WHERE NOW() - submitted_date < 'whatever' 
GROUP BY user_id, approved_flag 

espérons que cela fonctionne ..

+0

Pouvez-vous avoir un groupe avant avant où? –

+0

euhh je n'ai pas la syntaxe sql exacte en tête mais il semble que vous ayez raison je vais la corriger – eWolf

+0

Hmm, je ne sais pas ce que 'any' est censé être parce que je veux le rapport le plus récent pour chaque utilisateur, et Je ne pense pas que vous pouvez avoir une clause 'group by' avant une clause 'where' (au moins mon MySQL se plaint), et même alors, cela semble me donner des résultats en double si l'utilisateur a un résultat approuvé et non approuvé Je veux seulement le résultat le plus récent, approuvé ou non approuvé), merci d'avoir essayé! –

1

peut penser à deux façons de le faire. Le premier est peut-être le plus lisible, la recherche pour le dernier submitted_date par utilisateur, puis afficher l'approbation de cet horodatage:

select a.user_id, a.submitted_date, a.approved_flag 
from approvals a 
inner join (
    select user_id, maxdt = max(submitted_date) 
    from approvals 
    group by user_id 
) latest on latest.user_id = a.user_id 
    and latest.maxdt = a.submitted_date 

Le second est de se joindre à la table sur c'est des lignes futures pour le même utilisateur et spécifiez dans la clause where que ceux-ci n'existent pas. Cela vous donne la dernière entrée pour chaque utilisateur:

select cur.user_id, cur.submitted_date, cur.approved_flag 
from approvals cur 
left join approvals next 
    on next.user_id = cur.user_id 
    and next.submitted_date > cur.submitted_date 
where next.user_id is null 
Questions connexes