【问题标题】:Get last instance of counted rows获取计数行的最后一个实例
【发布时间】:2015-11-04 03:28:24
【问题描述】:

有两个表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

【问题讨论】:

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


    【解决方案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
    

    但是,如果您只想要拥有 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,因此您必须根据您的实际表定义进行调整。

    【讨论】:

    • 是的,这两个建议都是正确的。最后我确实需要除 5+ 以外的其他细分,所以第一个是必要的。
    【解决方案2】:

    你应该尝试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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多