2009-04-28 20 views
2

ich eine Tabelle von Berichten, die diese relevanten Felder hat:Zählen Datensätze aus einer gruppierten Abfrage mit zusätzlichen Kriterien

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

Es gibt mehrere Zeilen pro user_id, einige mit approved_flag = 0 und einige mit approved_flag = 1 und jeweils mit einem einzigartigen submitted_date.

Ich muss die genehmigten und nicht genehmigten Berichte zählen. Aber ich möchte nur den zuletzt übermittelten Bericht pro Benutzer zählen (zuletzt submitted_date), unabhängig von approved_flag.

Also, wenn gab es vier Datensätze wie folgt aus:

 
    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) 

die Zählung würde 2 genehmigt und keine nicht genehmigten, und wenn wir hätten 1 genehmigt

 
    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) 

der Graf sein (user ID 2) und 1 nicht genehmigt (Benutzer ID 1).

Um noch einmal zusammenzufassen, weil es nicht einfach zu beschreiben ist: Ich möchte die Gesamtzahl der eindeutigen Benutzer in der Tabelle (unabhängig von # Zeilen pro Benutzer) und ich möchte es in "genehmigt" und "nicht." genehmigt 'basiert auf dem approved_flag des letzten Berichts pro Benutzer.

Jede Hilfe wäre sehr dankbar, danke!

+0

Ich verstehe richtig, dass Sie nie eine Anzahl höher als eins (pro Benutzer) haben würde? und dass Ihre genehmigten + nicht genehmigten Zählungen niemals höher als eins (pro Benutzer) sein würden? –

Antwort

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

Was ist mit der Benutzer-ID passiert? –

+0

Dank Lieven, das gibt mir genau das, was ich gesucht habe! –

+0

@ Jonathan, die user_id war nur in der inneren Auswahl erforderlich, um das letzte übermittelte Datum pro user_id abzurufen und mit der äußeren Auswahl verbinden zu können. Für das Endergebnis war keine user_id erforderlich. –

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

Hoffe, es funktioniert ..

+0

Können Sie eine GROUP BY vor WHERE haben? –

+0

uhh Ich habe nicht die genaue SQL-Syntax im Hinterkopf, aber es scheint, Sie haben Recht, ich werde es korrigieren – eWolf

+0

Hmm, nicht sicher, was 'was auch immer' soll sein, weil ich den neuesten Bericht für jeden Benutzer möchte, und Ich glaube nicht, dass Sie vor einer Where-Klausel eine Gruppenklausel haben können (zumindest beschwert sich MySQL), und selbst dann scheint mir dies zu doppelten Ergebnissen zu führen, wenn der Benutzer ein genehmigtes und ein nicht genehmigtes Ergebnis hat (Ich möchte nur das neueste Ergebnis, genehmigt oder nicht genehmigt), danke für den Versuch! –

1

von zwei Möglichkeiten denken, dies zu tun. Der erste ist vielleicht die am besten lesen, wenn nach dem letzten submitted_date pro Benutzer, und dann mit diesem Zeitstempel der Zustimmung anzuzeigen:

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 

Die zweite ist die Tabelle verbinden darauf Zukunft Zeilen für den gleichen Benutzer ist, und geben Sie in der Where-Klausel, dass diese nicht existieren. Dies gibt Ihnen den neuesten Eintrag für jeden Benutzer:

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 
Verwandte Themen