sql - 获取计数行的最后一个实例

标签 sql postgresql date count greatest-n-per-group

有两个表jobsusersusersjobs 具有一对多关系。

我想获取所有完成 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

最佳答案

您可以为另一个提取每个用户的最后日期的派生表添加一个连接:

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 表看起来像 id (pk), user_id, date 因此您必须根据您的实际表定义进行调整。

关于sql - 获取计数行的最后一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31949666/

相关文章:

mysql - 在 SQL 中从多到少排序值

sql - Oracle函数: How to pass a table name as parameter,并使用游标结果作为表名?

postgresql - 如何将 postgis 对象和函数定义加载到单独的模式中?

javascript - 完整日历日单击并解决了时区更改的事件日期问题

sql - 匹配多个名字

SQL获取每行的最大列值

ruby-on-rails - 为什么在安装 gem 'pg' 时出现错误?

sql - 如何使用 Postgres 聚合 JSON 对象数组?

javascript - 如何解析部分日期

Javascript: `new Date(dateString)` 与 `new Date(year, month, day)` 之间的区别