подсчет записей из сгруппированного запроса с дополнительными критериями - PullRequest
2 голосов
/ 28 апреля 2009

У меня есть таблица отчетов с соответствующими полями:

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

Есть несколько строк на user_id, некоторые с approved_flag = 0, некоторые с approved_flag = 1 и каждая с уникальным submitted_date.

Мне нужно получить количество утвержденных и неутвержденных отчетов. Но я хочу только посчитать самый последний отправленный отчет для пользователя (самый последний submitted_date), независимо от approved_flag.

Итак, если было 4 таких записи:

    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)

счет будет 2 утвержден и не утвержден, и если бы у нас было

    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)

число будет 1 утверждено (идентификатор пользователя 2) и 1 не утверждено (идентификатор пользователя 1).

Подведем итог еще раз, потому что это не так просто описать: я хочу, чтобы общее количество уникальных пользователей в таблице (независимо от количества строк на пользователя) было разбито на «утверждено» и «не утверждено» 'на основе approved_flag самого последнего отчета на пользователя.

Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 3 ]

1 голос
/ 28 апреля 2009
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
1 голос
/ 28 апреля 2009

Можно придумать два способа сделать это. Первый, пожалуй, самый читаемый, ищите последнюю переданную дату для каждого пользователя, а затем отображайте утверждение с этой отметкой времени:

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

Второе - присоединить таблицу к будущим строкам для того же пользователя и указать в предложении where, что они не существуют. Это дает вам последнюю запись для каждого пользователя:

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
0 голосов
/ 28 апреля 2009
SELECT user_id, approved_flag, COUNT(*)
FROM reports 
WHERE NOW() - submitted_date < 'whatever'
GROUP BY user_id, approved_flag 

Надеюсь, что это работает ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...