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

postgresql窗口函数计算平均值的最小周期

Postgresql 累计总和 最近 3 天

PostgreSQL:first_value(unique_column)OVER()有啥问题?

postgreSQL - 更新同一个表中的列