2015-08-11 2 views
1

Есть две таблицы jobs и users. users имеет отношение 1 ко многим к jobs.Получить последний экземпляр подсчитанных строк

Я хочу получить электронное письмо всех пользователей, выполнивших 5 или более заданий.

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

Email   jobs done date of last of job 
[email protected] 5+   1-20-2015 
[email protected] 5+   2-20-2015 

Query, который захватывает все письма пользователей, которые сделали 5+ рабочих места

select 
email 
, case 
when times_used >= 5 
    then '5+' 
end as times_used 
from 
(
    select 
    u.id 
    , u.email as email 
    , count(*) as times_used 

from 
    jobs j 
    join users u on 
    j.user_id = u.id 
group by 
    u.id 
) 
a 
    where 
    times_used >= 5 
    group by 
    times_used 
    , email 

ответ

1

Вы можете добавить присоединиться к другой производной таблице, которая тянет последнюю дата для каждого пользователя:

select 
    b.email, 
    case when times_used >= 5 then '5+' end as 'jobs done', 
    b.max_date 'date of last job' 
from (
    select u.id, count(*) as times_used 
    from jobs j 
    join users u on j.user_id = u.id 
    group by u.id 
) a 
join ( 
    select u.id, u.email, max(j.date) max_date 
    from jobs j 
    join users u on j.user_id = u.id 
    group by u.id, email 
) b on b.id = a.id 
where times_used >= 5 

Но если вы хотите только электронную почту, количество рабочих мест и дату последнего задания для всех нас ERS, которые имеют 5 + рабочие места, то вы ниже запрос должен быть достаточно:

select u.id, u.email, max(j.date) max_date 
from jobs j 
join users u on j.user_id = u.id 
group by u.id, u.email 
having count(j.id) >= 5 

Оба запроса предполагают, что jobs таблица выглядит id (pk), user_id, date поэтому вы должны настроить в соответствии с вашим фактическим определением таблицы.

+1

оба предложения да пятно на. В конце концов, мне нужны другие сегменты, а не 5+, поэтому первое необходимо. – user1175817

0

Вы должны попробовать WINDOW функцию подход, так как это может быть более эффективным:

WITH user_jobs AS (
SELECT 
u.id as user_id, 
j.id as job_id, 
u.email, 
ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY j.date DESC) as rn, 
ROW_NUMBER() OVER (PARTITION BY u.id ORDER BY j.date) as job_number 
FROM 
jobs j 
join users u ON j.user_id = u.id 
) 
SELECT 
    user_id, 
    job_id, 
    email, 
    job_number 
FROM user_jobs 
WHERE rn = 1 and job_number >= 5 
Смежные вопросы