Postgresql 尝试使用 over() 计算总数的百分比。以前从未使用过 over() 但我读过这是正确的方法
Posted
技术标签:
【中文标题】Postgresql 尝试使用 over() 计算总数的百分比。以前从未使用过 over() 但我读过这是正确的方法【英文标题】:Postgresql Trying to calculate percentage of total using over(). Never used over() before but I've read this is the proper approach 【发布时间】:2020-01-06 00:25:54 【问题描述】:这是我的简单表结构,有几个结果:
年龄范围从 18 到 100 岁
我正在尝试计算有好工作的年龄范围的百分比,例如 18-24、24-30 等。我需要对“好工作”求和,因为这是调查数据,很多人没有响应,这么多空值。
我正在尝试将我可以在多个查询中执行的操作合并到一个查询中:
查询1:
select sum(good_job) as "18_24_GoodJobs"
from jf_q2
where
age >= 18 and age <= 24
and
working=1;
结果 61
查询2:
select sum(good_job) as "18_24_GoodJobs"
from jf_q2
where
age >= 18 and age <= 100
and
working=1;
结果 2571
使用单个查询执行以下操作:
select sum(good_job) as "18to24",
(sum(good_job)/ (select sum(good_job over(partition by good_job))) as Percentage)
from jf_q2
where
age >= 18 and age <= 24
and
working=1;
结果 = some_fractional number
我希望有类似的东西
18_24_GoodJobs| all_with_good_jobs
61 | 16%
这最终是一个烧瓶应用程序,我将不得不稍后处理这个问题,但我正在尝试获取此查询以绘制图形。
谢谢你,周日快乐
【问题讨论】:
【参考方案1】:您可以使用条件聚合来做到这一点:
select
sum(good_job) filter(where age between 18 and 24) 18_24_GoodJobs,
sum(good_job) filter(where age between 18 and 24)
/ sum(good_job) 18_24_GoodJobs_Part
from jf_q2
where working = 1
这为您提供了 18-24 岁的好工作数量以及 18-24 岁在好工作中的比例(以十进制值形式)。
【讨论】:
W00T!那行得通!我不得不在别名周围加上括号,但你救了我!以上是关于Postgresql 尝试使用 over() 计算总数的百分比。以前从未使用过 over() 但我读过这是正确的方法的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL 窗口函数:row_number() over (partition col order by col2)
Postgresql 根据单列或几列分组去重row_number() over() partition by