sql - 在 Postgres 中计算百分比

标签 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

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

SELECT COUNT(c), date FROM my_table WHERE c != 'bad' GROUP BY date;

返回:

count    date
3        2019-05-02
1        2019-05-01

我的目标是:

date         perc_good
2019-05-02   25
2019-05-01   75

所以我尝试了以下方法:

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;

我得到一个错误提示

more than one row returned by a subquery used as an expression.

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

Calculating percentage in PostgreSql

如何计算多行的百分比?

最佳答案

avg() 很方便用于此目的:

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

这是如何运作的? c = 'good' 是一个 bool 表达式。 ::int 将其转换为数字,1 表示真,0 表示假。平均值就是一堆 1 和 0 的平均值——并且是真实值的比率。

关于sql - 在 Postgres 中计算百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364637/

相关文章:

sql - 使用模式匹配字符的 postgresql 替换函数

mysql - 如何在mysql中将地址与状态连接起来

MYSQL按两个日期范围分组统计进行统计

mysql - LOAD DATA INFILE - 以字符终止的字段,该字符也出现在字段中

c# - 插入记录后如何从SQL Server获取标识值

java - 按主键查找与按唯一列查找有区别吗?

sql - 在用编程语言编写 SQL 时,使用 Natural Join 或 Implicit 列名不是一个好习惯吗?

python - Django 嵌套查询性能

django - 全文索引与 pattern_ops 索引

sql - union 在 PostgreSQL 中没有按预期工作