获取计数行的最后一个实例
Get last instance of counted rows
有两个表 jobs
和 users
。 users
与 jobs
具有一对多关系。
我想抓取所有完成 5 个或更多工作的用户的电子邮件。
下面的查询就是这样做的。但是,我怎样才能检索用户上次完成工作的日期。
所以所需的输出将是:
Email jobs done date of last of job
jack@email.com 5+ 1-20-2015
joe@email.com 5+ 2-20-2015
获取完成 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
您可以为另一个派生的 table 添加连接,为每个用户提取最后日期:
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
但是,如果您只想要拥有 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
table 看起来像 id (pk), user_id, date
所以你必须根据你的实际 table 定义进行调整。
您应该尝试 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
有两个表 jobs
和 users
。 users
与 jobs
具有一对多关系。
我想抓取所有完成 5 个或更多工作的用户的电子邮件。
下面的查询就是这样做的。但是,我怎样才能检索用户上次完成工作的日期。 所以所需的输出将是:
Email jobs done date of last of job
jack@email.com 5+ 1-20-2015
joe@email.com 5+ 2-20-2015
获取完成 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
您可以为另一个派生的 table 添加连接,为每个用户提取最后日期:
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
但是,如果您只想要拥有 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
table 看起来像 id (pk), user_id, date
所以你必须根据你的实际 table 定义进行调整。
您应该尝试 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