我的表是在postgre和我有这个表在我的数据库:
category status value
type a open 4
type a close 5
type b open 3
type b close 5
type c open 2
type c close 4
,我想计算open status
在每个类别中的百分比。公式为:% type x (open) = (open / open + close) * 100
查询,我期望得到:
category percentage
type a 44,44%
type b 60%
type c 50%
如何用查询得到想要的结果?
提前感谢。
您可以创建一个按类别划分数据的窗口,如下所示:
window w as ( partition by category )
然后您可以在该窗口上进行聚合,以使用定义的窗口获得每个类别打开的数量:
sum(value) filter (where status = 'open') over w
以同样的方式,您可以使用定义的窗口获得每个类别的总数,nullif
是为了避免被0分割:
nullif(sum(value) over w, 0)
把它们放在一起:
select distinct on (category)
category,
100 * sum(value) filter (where status = 'open') over w / nullif(sum(value) over w, 0) as percentage
from your_table
window w as ( partition by category );
当我们使用窗口函数而不是分组时,我们需要通过添加distinct on (category)
我认为聚合将是最有效的:
SELECT category,
100.0 * -- use a decimal point to force floating point arithmetic
sum(value) FILTER (WHERE status = 'open') /
nullif(sum(value), 0) AS percentage -- avoid division by zero
FROM your_table
GROUP BY category;