在 Postgres 中计算百分比

vw9*_*999 4 sql postgresql group-by

我对 PostgreSQL 完全陌生。我有一张名为 my_table 的表:

a    b    c        date
1    0    good     2019-05-02
0    1    good     2019-05-02
1    1    bad      2019-05-02
1    1    good     2019-05-02
1    0    bad      2019-05-01
0    1    good     2019-05-01
1    1    bad      2019-05-01
0    0    bad      2019-05-01
Run Code Online (Sandbox Code Playgroud)

我想计算每个日期 c 列中“好”的百分比。我知道如何获得“好”的数量:

SELECT COUNT(c), date FROM my_table WHERE c != 'bad' GROUP BY date;
Run Code Online (Sandbox Code Playgroud)

那返回:

count    date
3        2019-05-02
1        2019-05-01
Run Code Online (Sandbox Code Playgroud)

我的目标是得到这个:

date         perc_good
2019-05-02   25
2019-05-01   75
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下方法:

SELECT date, 
       (SELECT COUNT(c) 
        FROM my_table 
        WHERE c != 'bad' 
        GROUP BY date) / COUNT(c) * 100 as perc_good 
FROM my_table 
GROUP BY date;
Run Code Online (Sandbox Code Playgroud)

我得到一个错误说

用作表达式的子查询返回的多行。

我找到了这个答案,但不确定如何或它是否适用于我的情况:

在 PostgreSql 中计算百分比

如何计算多行的百分比?

Gor*_*off 5

avg() 为此目的很方便:

select date,
       avg( (c = 'good')::int ) * 100 as percent_good
from t
group by date
order by date;
Run Code Online (Sandbox Code Playgroud)

这是如何运作的? c = 'good'是一个布尔表达式。在::int它真正并将其转换成数字,以1 0假。平均值是一堆 1 和 0 的平均值——并且是真实值的比率。