如何划分单个 table 上的计数?

How to divide counts on a single table?

这是 Postgres 8.x,特别是 Redshift

我有一个 table,我正在查询 return 单个值,这是简单除法运算的结果。 Table 的纹理看起来像 user_id | campaign_title

除法运算就像 campaign_name 的行数 ilike %completed% 除以不同 user_ids.

的行数

所以我已经写出了所有的分子和分母查询,但老实说我很困惑如何组合它们。

分子:

select count(*) as num_completed
from public.reward
where campaign_title ilike '%completion%'
;

分母:

select count(distinct(user_id))
from public.reward

简单的解决方法,一个除以另一个:

select (select count(*) as num_completed
        from public.reward 
        where campaign_title ilike '%completion%') 
        / 
       (select count(distinct user_id) from public.reward);

稍微复杂但更快的解决方案:

select count(case when campaign_title ilike '%completion%' then 1 end) 
       /
       count(distinct user_id)
from public.reward;

表达式 count(case when campaign_title ilike '%completion%' then 1 end) 将只计算满足 when 子句中指定条件的行。


无关但是:

distinct 不是 函数。写 distinct(user_id) 是没有用的。而且 - 在 Postgres 的情况下 - 如果你一直认为 distinct 是一个函数,它实际上会给你带来麻烦,因为表达式 (column_one, column_2) 在 Postgres 中与列列表不同:column_one, column_2