获得计数 postgres 的总和

get sum of count of count postgres

我有两个表 jobsusers。 用户与作业具有一对多的关系。

我想将用户分成 jobs_done 个组。 换句话说,有多少用户做了 1 份工作、2 份工作、3 份工作等 下面的查询就是这样做的。但是,我想将完成 3 个或更多工作的所有用户归为一组。

这是我目前的查询

select
  jobs_done,
   count(1) as number_of_users
  from ( select 
     u.id,
      count(*) as jobs_done
   from jobs j
  JOIN users u on j.user_id = u.id 
  group by  u.id ) a
group by jobs_done 

当前输出:

times_used  number_of_users  
1           255  
2           100  
3           30  
4           10  
5           9  

期望的输出:

times_used  number_of_users  
1           255  
2           100  
3+          49  

您可以使用 case 表达式将值 3+ 分组为一个大组。这应该有效:

select
    case 
       when jobs_done >= 3 then '3+' 
       else cast(jobs_done as varchar(5)) 
    end as jobs_done,
    count(1) as number_of_users
from ( 
    select 
       u.id,
       count(*) as jobs_done
    from jobs j
    join users u on j.user_id = u.id 
    group by  u.id 
) a
group by case when jobs_done >= 3 then '3+' 
             else cast(jobs_done as varchar(5)) 
         end;

您基本上可以按所有内容进行分组。这是一个简单的例子:

test=# SELECT CASE WHEN x < 4 THEN x::text ELSE '4+' END AS y, 
              count(*) 
       FROM generate_series(1, 10) AS x 
       GROUP BY y 
       ORDER BY 1;
 y  | count 
----+-------
 1  |     1
 2  |     1
 3  |     1
 4+ |     7
(4 rows)